C언어

250616 - C언어 2일차

_KDE_ 2025. 6. 17. 12:33

9장 포인터

'선언할 때' * 의 의미 : 주소가 담기는 변수 = pa는 주소를 담는다

int a는 데이터를 담는 변수, int *pa는 주소를 담는 변수

 

함수가 있는데 매개변수가 주소인 함수 -> 매개변수에 주소를 줘야함 -> 매개변수가 그 주소를 받아서 대신한다.(Original 역할을 한다)

 

 

포인터 왜 써야 함?

1. 메모리 매핑 : Peripheral에 접근하기 위해서, CPU는 Peripheral이 GPIO인지 TIMER인지 모르고 그냥 해당 주소에 WRITE하거나 READ하거나

2. 함수에서 매개변수로 집어 넣을 때, 값을 복사하지 않고 실제의 값을 변경하고 싶을 때

3. 영상볼 때(영상 pointer를 메모리 증가하면서 계속 찍어내는 것)

 

예제

 

a : 일반 변수, 값을 저장하는 메모리 공간

*pa : 포인터 변수, 주소를 저장하는 메모리 공간

 

pa = &a; a변수의 주소를 저장

*pa = 10; 는 *(&a) = 10; 으로 볼 수도 있음

 

1234 : 사람이 읽을 때 큰 수 부터 읽음

0x1234 : 4(작은 수), 1(큰 수)

Big Endian : 사람이 읽는 방식

Little Endian : CPU가 읽기 쉬운 방식, 요새 대부분 CPU는 Little Endian

 

Little Endian 의 경우, 큰 수쪽이 메모리 주소가 높은쪽과 낮은쪽 어느 곳에 들어가는게 맞을까?

00, 01, 02,... 주소가 증가하면서 높은 숫자가 담김

12345678에서 78은 낮은 수, 12는 높은 수 임

위 그림에서 주소를 보면 낮은 주소에 낮은 수가 들어감

 

&a(좌), &pa(우)

int *pa -> pa가 저장한 주소가리키는 자료형은 int형 이다.

주소의 자료형은

 

 

 

 

 

 

포인터 변수의 크기는 8byte.

왜냐하면 주소의 크기는 8byte니깐

구조체, 함수에 대한 포인터도 8byte이다.

 

주소가 4byte면 포인터 변수도 4byte임

 

즉 포인터 변수의 크기는 주소 사이즈의 크기이다


옛날 윈도우 xp , 7같은 경우 32bit주소라 메모리를 4GB까지 밖에 사용못함

CPU가 메모리 주소를 나타내기 위해서 4byte까지 밖에 사용 못하는데

 

 

&b(좌), &pb(우)

 

('B' 는 10진수 아스키 코드로 42)'

 

 

 

 

int *pt는

int형으로 선언되어있는 total변수의 주로를 저장한다

 

 

 

a의 주소를 p에 대입

pd는 double형을 받는 포인터

pd에 a의주소를 대입하면 동작은 하지만 출력하면 이상한 결과 나옴

 

 

 

형 변환을 사용해서 포인터 대입

pd는 double형 포인터

pd가 저장하고 있는 것은 a의 주소임. 즉,  pi = (int*)(&a)라고 할 수 있음


※중요

swap은 매개변수로 포인터를 받고 있음

 

pa, pb는 a와 b의 대리인 역할

포인터를 이용해서 original에 접근

 

 

original에 접근할 수 없음 (a, b의 메모리 공간에)

swap이 안됨

 


10장 배열과 포인터

배열명으로 배열 요소 사용하기

int형의 ary라는 변수가 연속 3개 선언

 

배열의 이름은 주소이다!

(배열 첫번째 주소이다, 배열의 대표 주소이다(제일 앞에 있는))

 

 

만약 ary가 0x100이면

*(ary + 1)은 0x101이 아니다!!

index는 자료형의 크기만큼 위치가 움직임 -> 그래어 index라고 함

int형이면 index는 4byte씩 움직임

 

 

 

 

 

 

 

배열에 for문을 써서 포인터 주소를  증가 시킴 -> 편하다

 

포인터에 배열명 저장 가능

 

int ary[3] 은 12byte의 메모리가 할당

pa는 4바이트(첫 주소마 가지니깐!)

 

배열명은 값 바꿀 수 없음 : 배열 선언시 고정되니깐?(상수)

 

포인터는 변수니깐 증가 가능

 

 

 

 

 

 

 

ary는 배열 이름 -> 배열의 주소

print_ary 함수를 보면 주소를 받아서 출력

 

하지만 아주 위험한 함수임(system down)시킬 수 있음

WHY? 두개짜리 배열 출력을 하려고 선언했는데  선언되어있지 않은 메모리 access하려고함

지금은 read만 하기때문에 괜찮지만 write을 한다면 위험함

따라서 size가 들어감