[고급 C++]포인터 3편(배열 포인터/포인터 배열/문자열 상수 포인터)
- 컴퓨터공학과/Programming
- 2020. 10. 22.
배열포인터
다차원 배열의 시작주소를 저장하여 데이터로 사용하는 포인터 변수를 의미
* 2차원 배열포인터 : 2차원 정수형 배열 중에서 열의 크기가 5열인 배열의 시작주소가 대상
* cf) 포인터 변수: 1차원배열의 시작주소이거나 또는 변수의 시작주소가 대상
선언
자료형 (*변수명)[배열크기];
예시
1 #include <stdio.h> 2 3 int main() 4 { 5 int a, b[3], x1[4][5], x2[7][3], x3[2][5]; 6 int *p1; // 포인터 변수: 1차원배열의 시작주소이거나 또는 변수의 시작주소가 대상 7 int (*p2)[5]; // 2차원배열포인터 : 2차원 정수형 배열 중에서 열의 크기가 5열인 배열의 시작주소가 대상 8 9 printf("%d %d \n", sizeof(p1), sizeof(p2)); 10 11 12 p1 = &a; // o 13 p1 = b; // o 14 p1 = x1; // x 대상이 잘못됨 15 p1 = x2; // x 16 p1 = x3; // x 17 18 p2 = &a; // x 19 p2 = b; // x 20 p2 = x1; // o 21 p2 = x2; // x 행크기는 달라도 열크기 같아야함 22 p2 = x3; // o 23 return 0; 24 } |
!cc pointer5.c "pointer5.c", line 14: warning #2513-D: a value of type "int (*)[5]" cannot be assigned to an entity of type "int *" p1 = x1; // x 대상이 잘못됨 ^
"pointer5.c", line 15: warning #2513-D: a value of type "int (*)[3]" cannot be assigned to an entity of type "int *" p1 = x2; // x ^
"pointer5.c", line 16: warning #2513-D: a value of type "int (*)[5]" cannot be assigned to an entity of type "int *" p1 = x3; // x ^
"pointer5.c", line 18: warning #2513-D: a value of type "int *" cannot be assigned to an entity of type "int (*)[5]" p2 = &a; // x ^
"pointer5.c", line 19: warning #2513-D: a value of type "int *" cannot be assigned to an entity of type "int (*)[5]" p2 = b; // x ^
"pointer5.c", line 21: warning #2513-D: a value of type "int (*)[3]" cannot be assigned to an entity of type "int (*)[5]" p2 = x2; // x 행크기는 달라도 열크기 같아야함 ^ |
4 4 |
* p2++하면 주소값 20씩(열의 크기 * 대상자료형)만큼 증가!
포인터배열
포인터 배열은 주소 값들을 저장하는 배열
* 배열포인터가 다차원배열을 가리키며 주소를 1개 갖는 것에 반해, 포인터배열은 포인터변수가 여러개임(주소 4Byte * 개수)
선언
자료형 *변수명[배열크기]
- int (*a1)[3]; != int *a2[3];
예시
#include <stdio.h>
int main()
{
int num[3] = {100, 200, 300}, i;
int *p1; // 포인터변수 : 4byte
int *p2[3]; // 포인터 배열 : 4byte*3
printf("p1 sizeof : %d \n", sizeof(p1));
printf("p2 sizeof : %d \n", sizeof(p2));
return 0;
}
p1 sizeof : 4 |
문자열 상수 포인터
문자열 상수를 사용하기 위해 문자열을 메모리의 빈공간에 저장하고 시작주소를 반환하는데 이때 사용하는 것이 문자열 포인터
특징
- 저장된 주소가 사용
* “” 문자열상수!
예시
#include <stdio.h>
int main()
{
char *ptr;
ptr = "Hello World !!!";
printf("ptr: %p, %s \n", ptr, ptr);
return 0;
}
ptr: 040007d0, Hello World !!! |
활용
문자열 상수 포인터를 이용한 문자열 출력
1 #include <stdio.h> 2 3 int main() 4 { 5 int i; 6 char *ptr; 7 8 ptr = "Hello World !!!"; 9 printf("ptr: %p, %s \n", ptr, ptr); 10 11 char *ptr2[5]; 12 char *ptr1[5]={"kingdom", "Advanced C Program", "C++ Program", "C#s ", "one two three"}; 14 15 // 메모리 할당 16 printf("ptr sizeof : %d %d\n", sizeof(ptr1), sizeof(ptr2)); 17 18 // 자료형에 따라 주소(%p) , 문자열(%s) 19 for(i=0; i<5; i++) 20 printf("%p: %s \n", ptr1[i], ptr1[i]); 21 22 // unsized 사이즈 구하기 23 // NULL로 끝을 알림. 거짓일때까지 반복 가능 24 char *ptr3[] = {"kingdom", "Advanced c p", "하이 하이", "호이호이", NULL}; 26 for(i=0; ptr3[i]; i++) 27 printf("%p %s \n", ptr3[i], ptr3[i]); 28 29 return 0; 30 } |
:!a.out ptr: 040007d0, Hello World !!! ptr sizeof : 20 20 040007f0: kingdom 04000800: Advanced C Program 04000820: C++ Program 04000830: C#s 04000840: one two three 040007f0 kingdom 04000880 Advanced c p 04000890 하이 하이 040008a0 호이호이 |
궁금한 사항은 댓글로 남겨주세요💃💨💫
좋아요와 구독(로그인X)은 힘이 됩니다 🙈🙉
'컴퓨터공학과 > Programming' 카테고리의 다른 글
[고급 C++] 가변인자 / CERT C (feat. 안전 코딩하기) (1) | 2020.10.26 |
---|---|
[고급 C++]포인터 4편(다중 포인터/함수 포인터/void형 포인터) (1) | 2020.10.23 |
[고급 C++]포인터 2편(배열과 포인터) (0) | 2020.10.21 |
[고급 C++]포인터 1편(프로세스/포인터변수/포인터연산/NULL포인터) (0) | 2020.10.20 |
[고급 C++]조건 컴파일 / make (0) | 2020.10.19 |