어레이 주소 지정 시 다른 포인터 연산 결과
프로그램:
#include<stdio.h>
int main(void) {
int x[4];
printf("%p\n", x);
printf("%p\n", x + 1);
printf("%p\n", &x);
printf("%p\n", &x + 1);
}
출력:
$ ./a.out
0xbff93510
0xbff93514
0xbff93510
0xbff93520
$
상기 프로그램의 출력은 다음과 같습니다.예를 들어 다음과 같습니다.
x // 0x100
x+1 // 0x104 Because x is an integer array
&x // 0x100 Address of array
&x+1 // 0x104
하지만 마지막 진술의 결과는 내가 예상했던 것과 다르다. &x는 어레이의 주소이기도 합니다.따라서 여기서 1을 늘리면 주소가 4만큼 증가합니다.그렇지만&x+1주소를 10씩 늘립니다. 왜일까요?
x -> Points to the first element of the array.
&x ->Points to the entire array.
설명에 대해서는, http://arjunsreedharan.org/post/69303442896/the-difference-between-arr-and-arr-how-to-find 를 참조해 주세요.
SO 링크:arr과 arr이 같은 이유는 무엇입니까?
4가 되는 경우0x100 + sizeof x그리고.sizeof x4 *sizeof int= 4 * 4 = 16 = 0x10.
(시스템에서는sizeof int4)입니다.
이를 쉽게 평가할 수 있는 썸룰은 다음과 같습니다.
증분 포인터는 기본 유형의 다음 메모리 위치를 가리킵니다.
여기서 &x의 기본 유형은 int(*p)[4]입니다.이것은 4개의 정수로 이루어진 배열에 대한 포인터입니다.
따라서 이 유형의 다음 포인터는 원래 배열에서 16바이트 떨어진 곳(int가 4바이트라고 가정)을 가리킵니다.
그럼에도 불구하고.x그리고.&x같은 포인터 값으로 평가합니다.이것들은 다른 타입입니다.종류x포인터로 소멸된 후는int*반면 타입은&x이int (*)[4].
sizeof(x)이sizeof(int)*4.
따라서 이 수치적 차이는&x그리고.&x + 1이sizeof(int)*4.
2D 어레이를 사용하여 더 잘 시각화할 수 있습니다.예를 들어 다음과 같습니다.
int array[2][4];
메모리 레이아웃array다음과 같습니다.
array
|
+---+---+---+---+---+---+---+---+
| | | | | | | | |
+---+---+---+---+---+---+---+---+
array[0] array[1]
| |
+---+---+---+---+---+---+---+---+
| | | | | | | | |
+---+---+---+---+---+---+---+---+
이러한 배열에 대한 포인터를 사용하면
int (*ptr)[4] = array;
포인터를 통해 메모리를 보면 다음과 같습니다.
ptr ptr+1
| |
+---+---+---+---+---+---+---+---+
| | | | | | | | |
+---+---+---+---+---+---+---+---+
보시는 바와 같이ptr그리고.ptr+1이sizeof(int)*4이 유추는 다음 두 가지 차이점에 적용됩니다.&x그리고.&x + 1당신의 코드로.
믿거나 말거나, 프로그램의 동작은 정의되어 있지 않습니다!
&x + 1@i486의 답변에 따르면 실제로는 어레이 바로 너머를 가리키고 있습니다.당신은 그 기억이 없어요.포인터를 할당하려고 해도 정의되지 않은 동작이며, 참조 해제 시도는 말할 것도 없습니다.
언급URL : https://stackoverflow.com/questions/33775701/different-pointer-arithmetic-results-when-taking-address-of-array
'programing' 카테고리의 다른 글
| Mac에서의 JDK 경로란? (0) | 2022.07.30 |
|---|---|
| 재귀 매크로를 사용할 수 있습니까? (0) | 2022.07.30 |
| Vue 데이터 모델 속성 기반 속성 이름의 값을 가져오시겠습니까? (0) | 2022.07.29 |
| 부팅에 실패했습니다.이진수를 찾을 수 없습니다.이클립스 헬리오스의 CDT (0) | 2022.07.29 |
| JAX-WS를 사용한 XML 요구/응답 추적 (0) | 2022.07.29 |