[C 언어 - 배열에서 다양한 유형의 포인터의 역할]

1. 다른 유형의 포인터는 동일한 공간을 차지합니다.

포인터의 종류는 여러 가지가 있는데, 다양한 종류의 포인터가 차지하는 공간을 계산해 보면 모두 4바이트를 차지한다는 것을 알 수 있습니다.

	char* p1;
	int* p2;
	short* p3;
	float* p4;
	printf("%d\n",sizeof(p1));//4
	printf("%d\n", sizeof(p2));//4
	printf("%d\n", sizeof(p3));//4
	printf("%d\n", sizeof(p4));//4


2. 포인터 유형에 따라 역참조 범위가 결정됩니다.

먼저 변수를 정의합니다: int a = 0x11223344; (보충: 4자리 이진수는 16진수를 나타냅니다. 0x11223344는 총 32자리 이진수를 가지며 이는 4바이트로 간주할 수 있으며 int 유형으로 정의된 변수는 4입니다. 바이트)

int a = 0x11223344;

다음과 같이 메모리에 저장됩니다.

 데이터의 하위 바이트는 메모리의 하위 주소에 저장됩니다.

 데이터의 상위 바이트가 메모리의 상위 주소에 저장됩니다(리틀 엔디안 모드).

[Char형 포인터] 그런 다음 변수 a를 가리키는 char형 포인터 변수를 정의하고 포인터의 역참조를 다시 할당합니다.

char* pa1 = &a;
*pa1 = 0x88;

결과 출력:

 즉, char 유형 포인터를 사용하여 변수 a를 재할당하면 첫 번째 바이트만 변경되고 나머지 바이트는 변경되지 않습니다. 즉, char 유형 포인터는 바이트를 역참조합니다.

[int 형 포인터] a를 가리키는 int 형 포인터 변수를 정의하고 값을 다시 할당합니다.

	int * pa2 = &a;
	*pa2 = 0x55667788;

 이때 4바이트가 모두 변환되는데, 이는 int형 포인터를 사용하여 4바이트를 역참조할 수 있음을 의미한다.


3. 포인터 유형에 따라 포인터의 단계 크기가 결정됩니다.

[char 유형 포인터]

int c[10] = { 0 };
	char* p = c; 
	int i = 0;
	for (i = 0;i<10;i++)
	{
		*(p + i) = 1;
	}

결과: 위 그림에서 볼 수 있듯이 40바이트의 메모리가 할당되었습니다.

 char 포인터는 연속적으로 각 바이트를 가리키고, 먼저 첫 번째 바이트를 가리키고, 값을 할당한 다음, 다음 바이트를 가리킨 다음, 값을 할당하는 것을 볼 수 있습니다.

[int 유형 포인터] int 유형 포인터 변수를 정의하고 for 루프는 배열의 요소를 다시 할당합니다.

int c[10] = { 0 };
	int* p = c; 
	int i = 0;
	for (i = 0;i<10;i++)
	{
		*(p + i) = 1;
	}

결과: 40바이트의 메모리가 할당된 것을 확인할 수 있습니다.

과제 결과:

포인터는 첫 번째 바이트를 가리키며 현재 주소부터 연속된 4바이트에 값을 할당하고, 포인터는 5번째 바이트를 가리키며 다음 4바이트에 값을 할당하는 것을 볼 수 있습니다. (아래 그림과 같이 빨간색 01만 변경된다는 의미는 아닙니다. 실제로 할당 과정은 변경하는 것입니다.

01 00 00 00은 메모리에 저장됩니다)

더 선명한 표시를 위해:

다음과 같이 c[] 배열을 초기화하고 루프에서 배열 요소에 5 값을 할당했습니다.

	int c[10] = { 0x11111111,0x22222222,0x33333333,0x44444444 };
	int* p = c;  
	int i = 0;
	for (i = 0;i<10;i++)
	{
		*(p + i) = 5;
	}

결과: 처음 4바이트에는 각각 0x11111111, 0x22222222, 0x33333333, 0x44444444 값이 할당되며 다음은 기본값이 0입니다.

 그런 다음 첫 번째 for 루프 할당을 입력합니다.

즉, int 포인터는 첫 번째 주소를 가리키지만 역참조 범위는 연속된 4바이트입니다.

 

추천

출처blog.csdn.net/ggbb_4/article/details/129326918