본문으로 바로가기

C언 12일차 (포인터)

category 스마트팩토리/C언어 2020. 10. 21. 15:40

float fnum3을 3.125로 바꾸는 코드를 나타내는 모습이다.

char* p와 &fnum3의 자료형식을 맞추기 위해서 char*로 캐스팅해서 나타냈다.

3.125가 00 00 38 40 이기에 주소로 바로 들어가서 고칠려고 한다.

일단 *p로 가서 00을 바꾼다.

그 다음 주소로 넘어가야 하기때문에 ++p를 통해 다음으로 넘어간다.

그리고 계속해서 바꾸게 된다.

그 다음 출력하면 3.125가 출력되는것을 볼수 있다.

#include<stdio.h>

int main1()
{

	float fnum1 = 3.125f;
	float fnum2 = 5.0625f;
	float fnum3 = 523.6;
	char* P = (char*)&fnum3;

	printf("%f\n", fnum1);
	printf("%f\n", fnum2);
	printf("%f\n", fnum3);

	*P = 0X00;
	++P;
	*P = 0X00;
	++P;
	*P = 0X48;
	++P;
	*P = 0X40;

	printf("%f\n", fnum3);
	return 0;
    
}

 

프로그램 실행 순서

프로그램이 실행하게 되면 OS는 메모리(RAM)에 공간을 할당해준다
할당해주는 메모리 공간은 4가지(Code, Data, Stack, Heap)가 있다.

 

코드(Code) 영역

우리가 작성한 소스코드가 들어 가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code)영역이라고도 부른다.

코드영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.
메소드(기계어), 상수(문자열)   

R(Read)만 가능하다.

데이터(Data) 영역

전역변수와 static변수가 할당되는 영역
프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 소멸되는 영역

R(Road)/W(Write)가 가능하다. 

스택(Stack) 영역

프로그램이 자동으로 사용하는 임시 메모리 영역이다.
함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역이고,

함수 호출이 완료되면 사라집니다.

R(Road)/W(Write)가 가능하다.

힙(Heap) 영역

프로그래머가 할당/해제하는 메모리 공간이다.
이 공간에 메모리 할당하는 것을 동적 할당(Dynamic Memory Allocation)이라고도 부른다.

R(Road)/W(Write)가 가능하다.

 

밑에 코드의 주소를 통해서 stack영역에 저장되는 것들과 Code영역에 저장되는것을 확인할수 있다.

#include<stdio.h>

void test()
{
	printf("test\n");
}

int main()
{

	int a;
	int b;
	int c;
	char* p = main;

	
	//stack은 변수 영역이다.
	printf("Stack : %p\n", &a);
	printf("Stack : %p\n", &b);
	printf("Stack : %p\n", &c);
	
	//code는 영역에는 메소드랑 상수가 들어갈수 있다.
	//string에서 합치는것은 새로 만들어지는 경우만 있다.

	printf("Code : %p\n", main);
	printf("Code : %p\n", printf);
	printf("Code : %p\n", test);
	printf("Code : %p\n", "Hello kitty");
	printf("Code : %p\n", "Hello kitty1");

	printf("%02X\n", *p);
	*p = 0X55;		//출력이 안뜬다.	

	printf("end\n");
	return 0;

}

 

 

위에 코드를 확인할때 그림을 통해 확인하면 좀더 쉽게 확인이 가능하다.

int main()
{
	int n = 10;
	int* p1 = &n;
	int* p2 = p1;

	printf("%d\n", (*p1)++);
	printf("%d\n", (*p2)++);
	printf("%d\n", n);


	return 0;
}

 

(*(a ? &b : &c)++;

여기에서 삼항연산자를 사용해서 확인을 한다. a부분은 조건 &b는 참일때, &c는 거짓일때를 나타낸다.

C언어에서는 0과 0이 아닌 나머지 다를 나누어 거짓과 참으로 구분한다.

그래서 1이기에 참이므로 &b가 된다.

다시 써보면 (*&b)++;이된다. 여기서 *&는 소멸하기에 b++이 되고 b는 11이 된다.

출력을 하게 되면 밑에와 같이 나오게 된다.

#include<stdio.h>

int main()
{
	int a = 1, b = 10, c = 20;
	(*(a ? &b : &c))++;

	printf("a : %d, b : %d, c : %d\n", a, b, c);
	return 0;
}

 

 

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

C언어 14일차(배열)  (0) 2020.10.23
C언어 13일차(배열)  (0) 2020.10.22
C언어 11일차  (0) 2020.10.20
C언어 10일차(포인터)  (0) 2020.10.15
C언어 9일차(포인터)  (0) 2020.10.14