sourcecode

어레이의 주소가 C의 값과 같은 이유는 무엇입니까?

copyscript 2022. 8. 30. 22:26
반응형

어레이의 주소가 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 ★★★★★★★★★★★★★★★★★」&arrayarray+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

반응형