어레이의 주소가 C의 값과 같은 이유는 무엇입니까?
다음 코드 비트에서는 포인터 값과 포인터 주소가 예상대로 다릅니다.
그러나 어레이의 값과 주소는 그렇지 않습니다.
어떻게 이럴 수 있죠?
산출량
my_array = 0022FF00
&my_array = 0022FF00
pointer_to_array = 0022FF00
&pointer_to_array = 0022FEFC
#include <stdio.h>
int main()
{
char my_array[100] = "some cool string";
printf("my_array = %p\n", my_array);
printf("&my_array = %p\n", &my_array);
char *pointer_to_array = my_array;
printf("pointer_to_array = %p\n", pointer_to_array);
printf("&pointer_to_array = %p\n", &pointer_to_array);
printf("Press ENTER to continue...\n");
getchar();
return 0;
}
의 첫 되기 때문에 배열의 첫 번째 요소의 주소로 됩니다.array
★★★★★★★★★★★★★★★★★」&array
array+1
★★★★★★★★★★★★★★★★★」&array+1
배열의 길이가 1개 이상일 경우 동일하지 않습니다).
두 가지 . 입니다. 어레이음 음음음음sizeof
단항식&
자체를 (address-of), 어레이 객체 자체를 나타냅니다. ★★★★★★★★★★★★★★★★★▼sizeof array
는 포인터의 크기가 아닌 배열 전체의 바이트 크기를 나타냅니다.
으로 정의된 T array[size]
, , , , , , , 이 .T *
이의 다음 이 값을 늘리면 배열의 다음 요소에 도달합니다.
&array
같은 , 됩니다.T(*)[size]
의 요소를 것이 아닙니다. -- 、 일 、 일 、 일 、 일 、 단 、 단 、 -- 、 -- -- 、 -- -- -- -- -- -- -- -- -- -- 。이 포인터를 늘리면 단일 요소의 크기가 아니라 전체 배열의 크기가 추가됩니다.다음과 같이 입력합니다.
char array[16];
printf("%p\t%p", (void*)&array, (void*)(&array+1));
첫 번째 포인터보다 두 번째 포인터가 16자 배열이기 때문에 16자 더 클 것으로 예상됩니다.일반적으로 %p는 포인터를 16진수로 변환하므로 다음과 같이 됩니다.
0x12341000 0x12341010
어레이명(my_array
는, 이에요.이 주소는 배열 주소에 대한 별칭이며, 해당 주소는 배열 자체의 주소로 정의됩니다.
단, 포인터는 스택상의 일반 C 변수입니다.그 때문에, 그 주소를 취득해, 내부에 보관 유지되고 있는 주소와는 다른 값을 취득할 수 있습니다.
이 주제에 대해 여기에 썼습니다. 한 번 봐주세요.
에서 배열 ), (C; 주소(C; 주소)의 피연산자)가 한 배열 이름을 합니다.&
).sizeof
연산자는 첫 번째 요소에 대한 포인터로 소멸합니다.
에서는 " " 입니다.array
&array[0]
유형 및 가치 모두.
예에서는 " " 입니다.my_array
은 ★★★★★★★★★★★★★char[100]
은 것로A로 된다.char*
printf에 .
&my_array
은 ★★★★★★★★★★★★★char (*)[100]
(100의 배열)로 )char
&
이런 경우'라고 할 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수 등이 있습니다.my_array
첫 번째 요소에 대한 포인터로 바로 붕괴되지 않습니다.
배열에 대한 포인터는 배열의 첫 번째 요소에 대한 포인터와 동일한 주소 값을 가집니다. 배열 개체는 요소의 연속된 시퀀스일 뿐이지만 배열에 대한 포인터는 해당 배열의 요소에 대한 포인터와 다른 유형을 가집니다.이것은 두 가지 유형의 포인터로 포인터 계산을 수행할 때 중요합니다.
pointer_to_array
은 ★★★★★★★★★★★★★char *
의 첫 되었습니다.- 「 」 。my_array
- 및 initializer 식 - 로 됩니다.&pointer_to_array
은 ★★★★★★★★★★★★★char **
합니다).char
를 참조해 주세요.
중 : 음음음음 :my_array
후)char*
&my_array
★★★★★★★★★★★★★★★★★」pointer_to_array
어레이 또는 어레이의 첫 번째 요소 중 하나를 직접 가리키므로 동일한 주소 값을 가집니다.
<고객명>my_array
★★★★★★★★★★★★★★★★★」&my_array
같은 주소의 결과는 어레이의 메모리 레이아웃을 보면 쉽게 이해할 수 있습니다.
예를 들어 코드 내의 100이 아닌 10개의 문자 배열이 있다고 가정합니다.
char my_array[10];
모:의:my_array
음음음같 뭇매하다
+---+---+---+---+---+---+---+---+---+---+
| | | | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
^
|
Address of my_array.
C/C++에서 배열은 다음과 같은 식으로 첫 번째 요소에 대한 포인터로 감소합니다.
printf("my_array = %p\n", my_array);
어레이의 첫 번째 요소가 배치되어 있는 위치를 조사하면 해당 주소가 어레이의 주소와 동일한 것을 알 수 있습니다.
my_array[0]
|
v
+---+---+---+---+---+---+---+---+---+---+
| | | | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
^
|
Address of my_array[0].
C의 직전의 B 프로그래밍 언어에서는 포인터와 정수를 자유롭게 교환할 수 있었습니다.시스템은, 모든 메모리가 거대한 어레이인 것처럼 동작합니다.각 변수 이름에는 글로벌 또는 스택 상대 주소가 관련지어져 있습니다.각 변수 이름에 대해 컴파일러가 추적해야 할 유일한 것은 그것이 글로벌 변수인지 로컬 변수인지 및 첫 번째 글로벌 또는 로컬 변수와 관련된 주소입니다.
음음음음음음음 given given given given given 등의 글로벌 한다.i;
는 [정수/수치]로됩니다.address_of_i = next_global++; memory[address_of_i] = 0;
'하다, 하다, 하다, 하다, 하다.i++
같이 됩니다.memory[address_of_i] = memory[address_of_i]+1;
.
「 」와 같은 .arr[10];
로서 처리될 것이다.address_of_arr = next_global; memory[next_global] = next_global; next_global += 10;
선언이 처리되자마자 컴파일러는 어레이가 되는 것을 즉시 잊어버릴 수 있습니다.다음과 같은 진술arr[i]=6;
로서 처리될 것이다.memory[memory[address_of_a] + memory[address_of_i]] = 6;
「...」가 상관하지 않습니다arr
을 나타내다.i
정수 또는 그 반대입니다.실제로 둘 다 배열이든 둘 다 정수든 상관없습니다. 결과 동작이 유용할지 여부에 관계없이 설명된 대로 코드를 생성할 수 있습니다.
C 프로그래밍 언어의 목표 중 하나는 B와 대부분 호환되는 것이었다.B에서 배열의 이름(B의 용어로는 "벡터"라고 함)은 처음에 주어진 크기의 할당의 첫 번째 요소를 가리키도록 할당된 포인터를 보유한 변수를 식별했다. 따라서 그 이름이 함수의 인수 목록에 나타나면 함수는 벡터에 대한 포인터를 수신한다.C는 처음에 할당을 가리키는 포인터 변수가 아닌 할당 주소와 이름이 엄격하게 연관된 "실제" 배열 유형을 추가했지만, C형 배열이 벡터를 선언한 B 코드와 동일하게 동작하도록 한 후 해당 변수를 수정하지 않는 포인터 코드로 배열이 분해되도록 합니다.주소를 가지고 있다.
★★★★★★★★★★★★★★★★★.&myarray
★★★★★★★★★★★★★★★★★」myarray
둘 다 기본 주소입니다.
사용하는 대신 다른 점을 확인하고 싶다면
printf("my_array = %p\n", my_array);
printf("my_array = %p\n", &my_array);
사용하다
printf("my_array = %s\n", my_array);
printf("my_array = %p\n", my_array);
언급URL : https://stackoverflow.com/questions/2528318/how-come-an-arrays-address-is-equal-to-its-value-in-c
'sourcecode' 카테고리의 다른 글
"메인 클래스를 찾을 수 없거나 로드할 수 없습니다"는 무슨 의미입니까? (0) | 2022.08.31 |
---|---|
포인터 캐스팅 시 얼라인먼트에 대해 걱정해야 합니까? (0) | 2022.08.30 |
"thread"가 없는 "while(true)"가 되는 이유는 무엇입니까?sleep'이 원인이 되어 Linux에서는 CPU 사용률이 100%이지만 Windows에서는 그렇지 않으면 Windows에서는 CPU 사용률이 100%가 되지 않습니다. (0) | 2022.08.30 |
VUE2js: 소품 변경 후 컴포넌트를 재렌더하는 방법 (0) | 2022.08.30 |
##(더블 해시)는 프리프로세서 디렉티브에서 무엇을 합니까? (0) | 2022.08.30 |