본문으로 바로가기

스택 구조에서 변수들은 A가 가장 먼저 만들어지고 가장 밑에 깔리게 된다.

그 다음 iArray 배열이 만들어지고 A이 위에 쌓이게 된다.

그 다음 변수 B가 만들어 지고 iArray배열 위에 쌓기게 되면서 완성이 된다.

허나 여기서 iArray 배열의 내부는 스택구조의 영향을 받지 않는다. 보통대로 순서대로 만들어진다.

인덱스 [0]부터 [4]까지 순서대로 만들어진다고 생각하면 된다.

 

 

 

밑에 코드는 *(iArray + 0)은 iArray의 0번지의 값을 불러온다는 뜻이다. 나머지는 그 순서대로 출력한다.

iArray을 %p로 출력하였기에 iArray의 주소가 출력된다. 

 

#include<stdio.h>

int main()
{
	int A = 0X12345678;
	int iArray[5] = {100,101,102,103,104};
	int B = 0XABCDEF12;

	printf("%d\n", *(iArray + 0));
	printf("%d\n", *(iArray + 1));
	printf("%d\n", *(iArray + 2));
	printf("%d\n", *(iArray + 3));
	printf("%d\n", *(iArray + 4));
	printf("%p\n",iArray);

	return 0;

}

 

밑에 코드에서

printf("%d\n", *p);
printf("%d\n", *(p + 0));
printf("%d\n", p[0]);은 모두 같은 값을 출력한다.

디스어셈블리로 보게 되면 다르다는것을 알수 있다.(밑에 그림을 참조해라)

허나 printf("%d\n", *p);printf("%d\n", *(p + 0));은 같은 과정을 따르지만 printf("%d\n", p[0]);은 더 많은 과정을 따른다.

그렇기에 포인터로 하는것이 더 빠르다고 할수 있다.

 

#include<stdio.h>


int main()
{
	int A = 100;
	int B = 200;
	int* p = &A;
	int iArray[2];


	printf("%d\n", *p);
	printf("%d\n", *(p + 0));
	printf("%d\n", p[0]);

	printf("-------------------------\n");
	p = &B;
	printf("%d\n", p[0]);

	return 0;
}

 

iArray = &B;에서 오류가 난것을 알수 있다.

iArray에는 변수 자리인데 상수가 와서 이렇게 되었다.

 

 

밑에 코드를 보면 

char* str = "ABCDEFG";  ( 포인터 )

char arr[] = "ABCDEFG"; ( 배열 ) 이 있다.

밑에 그림을 통해 보면 쉽게 이해가 될것이다.

str은 code영역의 "ABCDEFG"을 가리킨다. 

arr[]은 stack영역에 생긴다.

그래서 str[0] = 'Z'를 하게 되면 나가리가 된다. WHY?  str을 가리키는 "ABCDEFG"은  code영역에 있어서 읽을수는 있지만 쓸수는 없다. 허나 arr[]은 stack영역에 있기에 읽고 쓰기가 가능해서 수정이 가능하다.

#include<stdio.h>

int main()
{
	char* str = "ABCDEFG";		//포인터
	char arr[] = "ABCDEFG";		//배열
	
	printf("%c\n",str[0]);
	printf("%c\n",arr[0]);
	//str[0] = 'Z';
	arr[0] = 'Z';
	printf("str [%s]\n", str);
	printf("arr [%s]\n", arr);
	return 0;

}

Tip.

변하지 않는거면 포인터로 만든다.
변하는것이람녀 배열로 만드는 것이다.

허나 여기서 배열로 만들게 되면 용량이 포인터에 비해 많이 든다. 이 부분을 고려해야 한다.

 

스마트팩토리C언어카테고리의 다른글

C언어 16일차(컴파일러)  (0) 2020.10.28
C언어 15일차(배열)  (0) 2020.10.27
C언어 13일차(배열)  (0) 2020.10.22
C언 12일차 (포인터)  (0) 2020.10.21
C언어 11일차  (0) 2020.10.20