-
포인터와 문자열(2)@ 16. 1 ~ 17. 1/C++ 2013. 1. 31. 20:24
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 2차원 배열을
int (*app)[3] = arr; 2차원배열을 가르키는 포인터
그리고..
int arr[3] = {1,2,3}; 1차원 배열을
일경우...
int (*app)[3]=(int(*)[3])arr; 2차원배열을 가르키는 포인터로 변환해서..
이런식으로하면...물론 일부에는 쓰레기값이 들어가긴하지만..
접근시에도 app[0][1] 이런식이 가능..
반대로 2차원 배열을 1차원 배열로..하면..
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int *app = (int*)arr;
이런식으로 형변환을 해주면..app[8]로 접근이 가능하다.
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int (*app)[3] = arr;
에서 app + 1일경우(2차원 메모리)
app[1]과 같다.
그럼 app[1]+1은?(1차원 메모리)
app[1][1]와 같다.
그럼 app[1][1]+1은?(값)
app[1][1]의 값에 +1한 값이다.
문자열이란?
\n 문자를 포함한 문자의 집합
첫 글자의 시작주소만 기억하면 문자들이 연속적으로 저장되어 있으므로 모든 문자에 접근이 가능하다.
char *cp = "ABCD";
이런식이면..
cp[0], cp[1], cp[2] 이런식으로 접근이 가능함..
*cp = "ABCD"의 뜻은 포인터 변수에 문자열을 저장하라가 아니라..
문자열의 시작주소(예:123123)를 포인터 변수에 저장하라는 의미이다.
또한 배열로도 가능하다.
char p[10] = "ABCD";
배열도 연속적인 메모리이기 떄문에 가능하다.
근데..*cp의 문자열은 상수영역의 메모리에 저장되서 수정이 불가능하고(cp[0]='z' 불가능)
p[10]은 변수 영역이므로 변경이 가능하다.(p[0]='z' 가능)
잠깐 정리!
1 : 정수를 의미하며 정수 10진수이다. 일 숫자'1' : 한 문자를 의미하며 ASCII 코드 정수 49이다. 일 문자
"1" : 문자열을 의미 메모리에는 '1'문자와 '\n'문자가 저장되어 있음(문자열의 시작주소를 char *포인터에 저장함)
'' : 문자를 포함하지 않으므로 컴파일 오류(공백도 문자다)
' ': 공백문자를 포함하였으므로 ASCII 32이다.
"" : 문자열을 의미하며 메모리에는 '\n' 문자가 저장되어 있고 문자열의 시작주소를 char * 포인터네 저장가능함..즉 널문자
" " : 공백을 포함한 문자열
'@ 16. 1 ~ 17. 1 > C++' 카테고리의 다른 글
포인터 정리(4) (0) 2013.01.31 void 형 포인터 및 함수 포인터(3) (0) 2013.01.31 배열(1) (0) 2013.01.29 포인터(1) (0) 2013.01.29 Template (3) 클래스 템플릿 특수화 (0) 2013.01.29