배열과 문자열
2025. 5. 1. 20:49ㆍ프로그래밍1및실습
1차원 배열
- Index 혹은 첨자가 추가된 변수
- int grade [4]와 같이 표현 가능하다.
배열의 선언
- 저장 공간에 연속적으로 할당.
- 배열명이 전체의 이름이다.
int array[5];

1차원 배열 초기화
- automatic, external, static은 가능!
- register는 불가능!
- 중괄호를 활용하여서 초기화 가능.
- 반드시 선언과 동시에 초기화 해주고, 선언 이후에는 하나씩 대입해야 한다.
int array[4]={0};
int array2[5]={1,2,3,4,5};
- 요소의 수보다 초기값이 작으면 나머지는 0으로 초기화된다.
int ary2[5]={1,2,3};

- external 또는 static은 초기화를 하지 않더라도 0으로 초기화됨.
배열의 첨자 연산
- array [i]에서 i가 0~(배열의 길이)-1을 넘어간다면 런타임 에러가 뜸.
int array[4]={1,2,3,4};
int a[4]; //런타임 에러
- 함수 호출 시의 ( )와 [ ] 연산자는 둘 다 가장 높은 우선순위이기 때문에 상황에 따라 대처해야 한다.
sizeof 연산자의 활용
- 배열은 보통은 많은 양의 데이터를 처리
- 배열 요소 수를 직접 계산하여 반복문에 사용하면 편리함
- (배열의 요소 수) = sizeof(배열명)/sizeof(배열 요소)
#include<stdio.h>
int main(){
int a[5]={1,2,3,4};
int cnt=sizeof(a);
printf("%d\n", cnt);
cnt/=sizeof(a[0]);
printf("%d", cnt);
}
20 //20바이트 차지
5 //5개의 요소 존재
- 전체 크기를 바이트 단위로 계산해주고 배열요소의 하나의 크기로 나누어주면 배열의 요소수를 구할 수 있다.
다차원 배열
- 2차원 배열
int a [14][14]: 14*14 만큼의 공간을 할당
- k-차원 배열
s1*s2*s3*s4...*sk개의 요소에 대한 공간을 할당
배열의 기본 주소에서 시작하여서 모든 요소들이 메모리에 연속적으로 저장됨
2차원 배열
int a [3][5];
-배열의 이름 a는 배열의 기본 주소는 &a [0][0]이다.
-배열은 기본 주소에서 시작하여서 compiler는 15개의 integer 공간을 할당함
#include <stdio.h> int main() { int a[5][4] = {{0,}}; printf("%p\n", &a[0][0]); printf("%p\n", a); return 0; }0x7ffd9f1f6f20 0x7ffd9f1f6f20
-&a [0][0]과 a의 주소가 동일함을 볼 수 있음.
2차원 배열 초기화
- 초기화 전에는 쓰레기 값 존재.
- 이를 해결하기 위해 중괄호를 활용하여 초기화해 줌.
- 행의 수는 생략 가능하다.
int a[][4]={{1},{4,5}, {9,10,11}};
//초기화
1 0 0 0
4 5 0 0
9 10 11 0
- 1차원 배열의 형식으로 초기화
int a[3][4]={1,2,3,4,5,6};
//초기화
1 2 3 4
5 6 0 0
0 0 0 0
- 전체를 0으로 초기화하고 싶으면 {0}으로 중괄호를 생성해 주면 된다.
pointers
-메모리에 접근하고, 주소 조작을 위해 사용
-만약 v변수 하면 &v가 가지고 있는 정보는 주소가 됨.
int *p;
p=0;
p=NULL; //0과 동일
p=&i; //int i; // i의 주소
p=(int*) 1776; //1776이라는 주소를 p에 넣어줌.(절대 주소)
문자열
- char의 1차원 배열
- 가장 마지막은 end-of-string을 나타내는 null문자로 끝남
- 문자열의 크기는 null을 포함해야 함 ("abc"의 char 배열의 크기는 4)
cf)
문자열 상수는 배열의 이름처럼 pointer로 취급!
#include <stdio.h> int main() { char *p="abc"; printf("%s\n", p); printf("%s\n", p+1); return 0; }abc bc
문자열 상수는 주소
- 같은 문자열 리터럴을 여러 번 사용할 경우
- 컴파일러는 리터럴 중 하나만 메모리에 저장하고 주소를 공유함.
#include <stdio.h>
int main() {
printf("%p\n", ("apple"));
printf("%p\n", ("apple")+1);
printf("%c\n", *("apple"));
printf("%c\n", *("apple"+1));
printf("%c", ("apple")[2]);
}
0x5f2ad357b004
0x5f2ad357b005
a
p
p
- 하지만 문자열 리터럴은 수정할 수 없다.
문자열 초기화
- 문자 상수로 하나씩 저장하거나 한 번에 초기화하는 방식이 있음.
char a[14]={'a', 'b', 'c', 'd'};
char b[14]="abcd";
- 널 문자를 저장할 공간도 필수임.
cf)
char *p="abcd";
-p라는 주소로 메모리 공간을 할당해 줌.char a[]="abcd";
-문자열 길이+1만큼의 메모리를 할당해 줌.
char 배열의 초기화
- scanf()로 입력 값을 받을 때는 배열명만 사용함. (&사용 안 함)
#include <stdio.h>
int main() {
char a[]="abcdefg";
printf("%s\n",a);
scanf("%s", a);
printf("%s", a);
}
- 초기 배열은 abcdefg이지만 입력을 받은 이후에는 값을 덮어 씌움.
처음
a b c d e f g \0..
입력 후
a b c d \0 f g \0..
문자열 대입
- 초기화 이후에도 새로운 문자열 저장 가능
- 일반 변수처럼 대입 연산은 불가!
char a[14];
a="abcd";
- strcpy 함수: char형 배열에 새 문자열을 저장할 때 사용함.
#include <stdio.h>
#include<string.h>
int main() {
char a[14]="abcdefg";
char b[14];
strcpy(b,a);
printf("%s %s", a, b);
}
abcdefg abcdefg
문자열 전용 입출력 함수
#include <stdio.h>
#include <string.h>
int main() {
char s[84];
fgets(s, sizeof(s), stdin);
s[strlen(s)]='\0';
puts(s);
return 0;
}
- fget을 활용하여서 문자열을 입력받고, puts를 활용하여서 출력 가능하다.
문자열과 null 문자
- Null문자가 마지막에 없을 경우에는 이어진 메모리 영역도 출력하면서 쓰레기 값을 출력한다.
Ragged Arrays
- 각 행마다 열의 개수가 다른 배열
- 가변적인 크기의 배열을 가리키는 포인터들이 모든 배열!
char a [2][15]={"abc:", "a is a apple"};
-30개의 저장 공간 할당
char *p [2]={"abc:", "a is a apple"};
-char를 가리키는 pointer들의 1차원 배열
-2개의 pointer를 저장하기 위한 공간 할당
-초기화 후에는 문자열을 초기화할 수 없음.
-mapping 함수를 활용하지 않아서 a배열보다 빠름!
- 포인터 변수와 배열 인덱스 사이의 메핑에 대해서 본다면 다음과 같다.
#include <stdio.h>
#include <string.h>
int main() {
int a[2][3]={1,2,3,4,5,6};
printf("%d\n", a[1][2]);
printf("%d", *(&a[0][0]+5));
}
'프로그래밍1및실습' 카테고리의 다른 글
| week3(실습 문제) (0) | 2025.05.22 |
|---|---|
| week2(실습 문제) (0) | 2025.05.22 |
| 4주차 (0) | 2025.04.30 |
| 3주차(2) (0) | 2025.04.30 |
| 3주차 (0) | 2025.04.08 |