비교 조건 \ 비교 대상 | 포인터 | 배열 |
이름 | 있음 | 있음 |
나타내는것 | 메모리 주소 | 메모리 주소 |
변수인가 상수인가 | 변수 | 상수 |
* 배열 이름은 = 상수 포인터이다.
arr ==> 주소를 나타내고 해당 주소를 ptr에 넣어주므로
arr과 ptr은 같아진다. 주소를 나타내므로
포인터의 연산
해당 포인터의 선언된 타입에 따라 증감하면 해당 바이트 크기만큼 증감된다.
arr[ i ] == *(a+i) 으로 나타낼수있다.
문자열은 문자열 배열은 변수이고 ==> char str1[5] = "abcd"; -> 변수 str1
문자열 문자는 상수이다 ==> char *str1 = "abcd"; -> 상수 *str1
또한 문자열 상수의 경우는 "두개의 문자열 상수가 완전히 똑같을 경우"
문자열은 한개의 메모리 공간에 저장되고, 두개의 변수는 한개의 메모리 주소를 가르킨다.
이러한 특징을 가지고 문자열 배열을 나타낼수 있다.
=============================================================================
우선 배열을 선언하고
array[3] = 0x55; 값을 대입하고
*(array+3) = 0x77; 값을 대입했다
해당 내용을 gdb를 통해서 디버깅 해보자
해당 결과를 보면
결국에 같은 주소에 0x55, 0x77이 대입된것을 확인 할 수 있는데 이것을 그림으로 나타내자면
이렇게 나타낼수 있고 실제로 주소값을 찍어보면 아래와 같다.
printf(" array %d", array);와
printf(" &array %d", &array); 동일하게 나타나며,
array[0] 값과 동일 하다 즉 array로 표현하면 해당 배열의 시작주소를 나타내는 것이다.
또한 해당배열이 array[0] -> array[1] --- 쭉 가면서 4씩 커지는 것을 확인 할 수 있다.
따라서 *(array+3)을 한다면 array[3]과 동일하게 표현할 수있다.
여기서 궁금증이 생기는데 해당 주소는 4씩 차이가 나는데 왜
+1, +2, +3 을해도 실제 메모리 주소에서는 4씩 차이가 나는걸까 동일하게 char 배열에서도
*(array_c+2) *(array_c+3) *(array_c+4) 를 실시해도 해당 자료형의 크기만큼 증가되는것을 확인 할 수있따.
*(array+2) = 0x76
*(array+3) = 0x77 == array[3] = 0x77 동일 == array+3 의 값을 주소로 보고 해당 주소로 가서 값을 0x77로 바꿔라
*(array+4) = 0x78
*(array_c+2) = 0x91
*(array_c+3) = 0x92
*(array_c+4) = 0x93
이것은 컴파일러가 내부적으로 해당 자료형에 맞게끔 메모리 주소를 저장시켜주는건데
포인터의 자료형을 선언해주는 이유가 된다.
'OS > Linux' 카테고리의 다른 글
[C/Linux] 배열의 선언 (0) | 2022.09.12 |
---|---|
[C/Linux] static 변수 (0) | 2022.09.10 |
[Linux/C] 파일 입출력1-1(표준입출력) (0) | 2022.05.25 |
[Linux/C] 파일 입-출력2 (0) | 2022.05.25 |
[Linux/C] Makefile (1) | 2022.05.19 |