String = "archie";
컴파일러는 "archie"중에 'a'가 저장된 곳의 주소를 string에 할당한다.
"archie"는 문자열 상수다.(상수라 변경이 불가함)
*(string +3) == string[3] == *(3+string) ==3[string]
다른 언어에서 [ ]는 배열의 범위를 나타내지만 C언어에서의 [ ]는 연산자이다. 두개의 피 연산자를 가지며 하나의 피 연산자는 기본 위치를, 다른 피 연산자는 기본위치에서 얼마만큼 떨어져 있는지를 나타낸다. 순서가 상관 없다.
1. char *string = "archie";
2. char dim[] = "dimention";
string은 포인터 변수이기 때문에 메모리 할당을 받고 dim은 배열명이기 때문에 메모리 할당을 받지 않는다. dim과 &dim, &dim[0]는 모두 같다.
1. archie가 어딘가에 저장되고 'a'의 주소가 string에 할당된다. string이라는 변수와 "archie"라는 문자열은 별개로 존재한다.
2. dim은 배열이다. "dimention" 문자열이 하나씩 dim배열에 할당된다.
1. string++;
2. dim++;
1번은 string = string +1; 로 string이 가리키던 'a'의 주소에 +1을 하여 'r'을 가리키게 된다.
2번은 dim = dim +1;로 dim+1은 'i'가 저장된 곳의 주소를 가리킨다. 이 값을 dim배열명 자체에 넣으려고 하고 있는데 dim은 배열명이지 변수가 아니다.
dim은 변수가 아닌 배열 상수이다.
char *string = "archie";
*string ='T';
//Segmentation Fault(memory dump)
char string[]="dimention";
string[0] = 'T';
puts(string);
//Timention
문법적으로 'T'라는 문자가 string이 가리키고 있는 번지에 할당된다로 해석된다.
"archie"는 문자열 상수다. 상수는 변화될 수 없으며 string이 가리키고 있는 주소에는 변수가 아닌 상수가 들어 있으므로 컴파일 에러가 난다.
<<포인터 배열>>
char name[5][20];
name[0] = "archie";//오류가 발생
"archie"문자열 중 'a'가 저장된 위치를 name[0]에 넣으려고 하고 있다. name이라는 배열명이 배열 상수인것 처럼 name[0], name[1]....는 모두 상수다. 이런 이유로 주소값 할당이 불가능하다.
strcpy(name[0], "archie"); 처럼 사용해야 한다.
char *name[5];
name[0]="archie";//정상적으로 처리
name은 포인터 배열이다. 포인터를 저장할 수 있는 배열이며 포인터 저장 공간이 모두 5개 생겼다.
name[0] 포인터 배열 변수에 'a'가 저장된 곳의 주소를 할당하고 있다.
char name[5][20]에서 배열명 자체는 메모리가 할당되지 않는 것 처럼 char *name[5] 포인터 배열도 name[0]..이 메모리에 할당되며 각각은 주소를 저장할 수 있다. 하지만 name이라는 포인터 배열명은 절대 메모리가 할당되지 않는다.
char *name[5];
name[0] = "archie";//'a'주소를 name[0]에 할당
strcpy(name[0], "archie");//name[0]에 저장된 garbage주소에 'a'주소 값을 복사//오류가능성 높음
포인터 배열을 사용하며 strcpy()를 이용할 수 있는 방법
char *name[5];
1) name[0] = (char *)malloc(sizeof(char) *strlen("archie")+1;
2) char imsi[7];
name[0] = imsi;
strcpy(name[0],"archie");
1) malloc()을 이용해 안전한 공간을 할당해 준다.
2) 배열을 이용해 주소를 초기화 한다.
from 다시 체계적으로 배우는 C언어 포인터(정재은)
'IT > 개발의짜릿함' 카테고리의 다른 글
[nodejs]npm설치 시 proxy 이슈 (0) | 2018.04.30 |
---|---|
정규식 표현식 (0) | 2018.01.19 |
SQL변수 java변수 변환(_소문자를 대문자로) (0) | 2017.12.11 |
Recent Comment