포인터 기초

쿵ㅇ양·2023년 8월 22일

알고리즘

목록 보기
14/18

포인터를 매개변수로 받아 매개변수에 42넣기

포인터 = 자신이 사용하고 싶은 메모리의 '주소' 저장하고 있는 메모리

-모든 변수는 메모리에 값을 저장
-이러한 메모리의 공간을 구별하는 것이 메모리 주소값
-포인터는 연산이 가능

포인터 변수(=사물함) 선언

int a = 5;
int *b = &a; ✔*는 포인터 변수를 선언하기 위해 사용

-int *b = &a; 처럼 선언할 때에는 변수명 앞에 *를 붙혀서 포인터 변수임을 명시
-포인터 변수의 크기는 무조건 4바이트이기 때문에 포인터 변수의 크기를 적을 필요 없음
-선언한 이후에 *b라고 쓰게 되면, 포인터 변수가 가르키는 주소값을 의미. 즉 5가 된다
-&a는 변수 a에 &를 붙힘으로 a의 주소값을 의미

변수가 저장된 메모리 공간의 주소

프로그램은 실행될 때마다 사용할 메모리 공간의 주소 달라짐
따라서 포인터가 가리키는 대상의 주소를 직접 입력하면 오류 발생
그래서 프로그램 안에 선언한 다른 변수의 주소를 직접 받아와서 입력하기!

int a;
int *ptr; ✔가리키는 대상의 크기 4바이트/자신의 크기도 4바이트
ptr = &a;

*을 붙이고 안붙이고의 차이점

short *ptr;
ptr = (short *)0x000006c ✔포인터 변수에 주소 직접 대입

포인터 변수도 일반 변수처럼 자신을 위한 메모리 공간 존재
일반 변수와 차이점은 포인터 변수는 주소를 저장하기 때문에 메모리 크기가 4바이트로 고정
포인터 변수에 저장된 주소는 포인터가 가리키는 대상 메모리의 시작 주소
2.

short *ptr;
ptr = (short *)0x0000006c;✔실제로는 고정 주소 사용x,어떤 주소 영역에 할당될지 예측x
*ptr = 0x0412;✔포인터가 가리키는 대상의 값 저장

포인터가 가리키는 대상을 사용하려면 포인터 변수에 대상의 주소가 먼저 저장되어 있어야함
포인터가 가리키는 대상의 값을 변경할 때는 ptr 변수 앞에 *연산자 추가

매개변수로 다른함수의 변수값 받기vs 매개변수로 다른함수의 변수주소 받기

-매개변수로 다른 함수의 변수값 받기

#include<stdio.h>
void Test(short data)
{
	short soft = 0;
    soft = data;
    tips = 3;✔오류발생
}
void main()
{
	short tips = 5;
    Test(tips);
}

tips 변수값을 넘겨 받았을뿐이니 Test함수에서 main함수의 tips 변수 값을 직접 수정할 수는 없음
매개변수가 대상 변수의 주소가 아닌 변수가 가지고 있는 값인 5를 넘겨 받았을 뿐이기 때문!!!!
.
-매개변수로 다른 함수의 변수의 주소받기

#include<stdio.h>
void Test(short *ptr)
{
	short soft = 0;
    soft = *ptr;
    *ptr = 3;
}
void main()
{
	short tips = 5;
    Test(&tips); ✔ptr = &tips
}

포인터 변수 ptr을 선언해서 main함수의 tips 변수 주소를 받음
tips 변수의 주소를 ptr포인터가 가지고 있으므로 *ptr을 사용해서 해당 주소에 저장된 값을 가져오거나 대입할 수 있음
포인터를 사용하면 선언된 변수의 값을 변경할수도 있음

void	ft_ft(int *nbr)

{

	*nbr = 42;

}

profile
개발을 공부하고 있는 대학생

0개의 댓글