1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
char a[] = "hello"; char b[] = "world"; char c[] = "string";
char* arrdata[] = { a,b,c }; //요소들이 char* 인 배열이다. 포인터가 아님!!
char* *pndata = arrdata; //char*의 주소 -> char **에 저장
printf("%s\n", *(pndata+1)+1);
printf("%c\n", *(*(pndata)+1));
printf("%d", argc);
for (int i = 0 ; i < argc; i++)
{
printf("%s\n", *(argv+i));
}
|
cs |
3:
요소들의 자료형이 char*인 배열 arrdata를 선언 및 정의하는 부분.
요소들은 char 배열의 이름들이고, 배열의 이름은 배열의 첫번째 요소의 주소를 나타낸다.
따라서 char에 대한 포인터로 해석할 수 있다.
(int에 대한 주소를 저장하는 자료형 -> int * / char에 대한 주소를 저장하는 자료형 -> char*)
5:
arrdata 는 char *인 요소들로 이뤄진 배열이고, arrdata의 이름은 char *가 저장된 주소를 가리키고 있다.
따라서 char *의 주소는 char ** 에 저장하므로.
pndata를 char**로 선언 및 정의한다.
7:
서식지정자 %s로 출력하기 위해서 char배열의 주소값을 인자로 넣어야 한다.
pndata + 1 의 경우 pndata가 가리키고 있는 자료형이 char*로 4byte 이므로, pndata속에 저장된 arrdata의 주소에서 4만큼을 더한다. W의 주소값이 저장된 메모리의 주소(arrdata의 2번째 요소의 주소와 같다.) 가 되고, 그 주소에 간접지정을 취하면, W의 주소가 반환된다. (arrdata[2]와 같음)
여기서 +1을 하면 W의 주소는 char * 와 같으므로 o를 가리키는 주소가 반환된다.
8:
서식지정자 %c로 출력하기 위해서 char형 데이터를 인자로 넣어야 한다.
*pndata 의 경우 *arrdata와 같고, arrdata의 주소에서 4바이트를 읽는다. 결국 char *형인 주소 a가 반환된다.
a에 +1을 하면, a는 char * 형이므로 1바이트 만큼 증가한 e의 주소를 얻게되고, 그 주소에 간접지정을 취하면 값 e가 반환되어서 e가 출력된다.
'Programing > 명강의 C' 카테고리의 다른 글
C 포인터 이해하기 (0) | 2019.05.10 |
---|---|
동적할당 이용 (0) | 2019.05.07 |