못정함
C언어) 9-2. 포인터 완전 정복을 위한 포인터 이해하기 본문
-포인터는 변수이므로 값을 얼마든지 바꿀 수 있다.
-언제든지 다른 주소를 저장하거나 포인터끼리 대입할 수 있다
-그러나 대입 연산에 엄격한 기준이 적용된다.
<주소와 포인터의 차이>
주소 | 변수에 할당된 메모리 저장 공간의 시작 주소 값 자체 상수 |
포인터 | 주소를 저장하는 또 다른 메모리 공간 변수 |
따라서
-두 포인터가 같은 주소를 저장하는 것 가능 (하나의 변수를 동시에 가리킨다.)
-주소도 포인터처럼 간접 참조 연산자를 쓸 수 있지만, 상수이므로 대입 연산자 왼쪽에 올 수 없음.
&a = &b 불가능.
<주소와 포인터의 크기>
-포인터도 저장 공간이므로 그 크기가 있음 : 저장할 주소의 크기에 따라 결정된다.
-모든 주소와 포인터는 가리키는 자료형에 관계 없이 크기가 같다.
-sizeof 연산자로 크기 확인
<포인터의 대입 규칙>
-포인터는 크기가 모두 같다.
<규칙>
1. 포인터는 가리키는 변수의 형태가 같을 때만 대입해야 한다.
같은 포인터지만 int / double이 다를 경우 오류가 난다.... (이유는 생략)
2. 형 변환을 사용한 포인터의 대입은 언제나 가능하다.
-포인터가 가리키는 자료형이 달라도 형 변환 연산자를 사용하면 대입 가능.
근데 뭔가 이것도 문제가 잇음...;;; 메모리 저장방식을 정확히 이해하고 사용해야하지만 난 바보니까 그냥 사용하지 않기로 하자
<포인터를 사용하는 이유>
임베디드 프로그래밍: 메모리에 직접 접근하는 경우 | 임베디드 프로그래밍? Embedded System을 제어하기 위한 프로그램. (내장형 시스템). 생활 기기에서 특정 기능을 제어하기 위해. ex) 정수기에서 정수/냉수 구분하는 거 |
동적 할당한 메모리를 사용하는 경우 |
동적할당? 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음에 요구가 오면 재 할당을 받을 수 있다. |
두 변수의 값을 바꾸며 포인터 이해하기
#include <stdio.h>
void swap(int *pa, int *pb); //함수 선언
int main(void)
{
int a= 10, b= 20;
swap(&a, &b); //a,b의 주소를 인수로 준다
printf("a:%d, b:%d\n", a, b); //변수 a,b를 출력
return 0;
}
void swap(int *pa, int *pb) // main이 돌아가면 pa, pb는 각각 a,b를 가리키는 상태가 됨.
{
int temp; //교환을 위한 임시 변수
temp = *pa; //temp에 pa가 가리키는 변수의 값을 저장
*pa = *pb; //pa가 가리키는 변수에 pb가 가리키는 변수의 값을 저장
*pb = temp; //pb가 가리키는 변수에 temp 값을 저장
}
-swap 함수는 포인터를 통해 main함수의 변수 a,b를 공유하므로 두 변수를 직접 바꾸는 것이 가능.
-main함수의 변수 자체가 값이 바뀌는 것임
포인터 없이 두 변수의 값을 바꾸는 함수는 불가능한가?
다른 함수의 변수 사용하기 -> 불가능
#include <stdio.h>
void swap(void);
int main(void)
{
int a= 10, b = 20;
swap();
print("a: %d, b:%d\n", a, b);
return 0;
}
void swap(void)
{
int temp;
temp = a;
a = b;
b = temp;
}
함수 안에 선언된 변수명은 사용 범위가 함수 내부로 제한되기 때문. main 함수 안에 있는 a, b를 main함수 밖에서 사용할 수 없다.
그렇다면...
변수의 값을 인수로 주자 (변수를 복사해서 사용) => 얘도 불가
#include <stdio.h>
void swap(int x, int y);
int main(void)
{
int a= 10, b= 20;
swap(a,b);
printf("a:%d, b:%d\n", a, b);
return 0;
}
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
-컴파일 오류가 나는 것은 아닌데
실행결과가 a: 10. b:20
swap 실패함
왜냐하면 함수는 오직 하나의 값만을 반환할 수 있기 때문. 한 번의 함수 호출을 통해 두 변수의 값을 바꾸는 것은 불가
와 포인터의 중요성을 깨달았다.
'C언어 공부 > C언어 독학 (교재)' 카테고리의 다른 글
C언어) 9-1 포인터의 개념 (0) | 2024.10.09 |
---|---|
C언어) 8-2장: 문자를 저장하는 배열 (1) | 2024.09.16 |
C언어) 7-2장: 여러 가지 함수 유형 (0) | 2024.09.16 |
C언어) 7-1장: 함수의 작성과 사용 (0) | 2024.09.15 |
C언어) 6장: 반복문 (0) | 2024.09.15 |