[C언어] 포인터

yunssup·2023년 6월 13일
0

C언어

목록 보기
12/13
post-thumbnail

1. 포인터란?

  • 주소를 가지고 있는 변수 의미
    변수는 메모리에 저장되며, 메모리는 바이트 단위이다.

2. 변수와 메모리

  • 변수의 크기에 따라서 차지하는 메모리의 공간이 달라짐.
  • char형 변수 = 1바이트, int형 변수 = 4바이트 등...

3. 변수의 주소

  • 변수의 주소를 계산하는 연산자 : &
    예시) 변수 i의 주소는 ?? &i
#include <stdio.h>
int main(void) {
	int i = 10;
	char c = 69;
	float f = 12.3;

	printf("i의 주소 : %u\n", &i); //변수 i의 주소 출력
	printf("c의 주소 : %u\n", &c); //변수 c의 주소 출력
	printf("f의 주소 : %u\n", &f); //변수 f의 주소 출력

	return 0;
}

4. 포인터 선언

  • 포인터는 변수의 주소를 가지고 있는 변수
int i* p;
이는 정수를(int)가리키는(*)포인터(p)

5. 포인터와 변수의 연결

int i = 10; // 정수형 변수 i 선언
int*p; // 포인터 변수 p 선언
p=&i; // 변수 i의 주소가 포인터 p로 대입

int*p=&i // 위의 두 줄을 한줄로 표현 

예제)

#include <stdio.h>
int main(void) {
	int i = 10;
	double f = 12.3;

	int* pi = NULL;
	double* pf = NULL;

	pi = &i;
	pf = &f;

	printf("%u %u\n", pi, &i);
	printf("%u %u\n", pf, &f);

	return 0;
}

6. 간접 참조 연산자

  • 포인터가 가리키는 값을 가져오는 연산자
int i =10;
int*p;
p=&i;
printf("%d",*p);
  • 지정된 위치에서 포인터의 타입에 따라 값을 읽어들인다.
int*p=8; //위치 8에서 정수를 읽는다.
char*pc=8; // 위치 8에서 문자를 읽는다.
double*pd=8; // 위치 8에서 실수를 읽는다. 

7. &연산자와 *연산자

  • &연산자 : 변수의 주소 반환, 변수의 주소를 구하여 포인터에 대입할 때 사용
  • *연산자 : 포인터가 가리키는 곳의 내용 반환, 포인터를 통하여 변수를 간접 참조할 때 사용

8. 포인터 사용시 주의할 점

  1. 초기화가 안된 포인터 사용하지 말 것 >> 포인터가 아무것도 가리키고 있지 않는 경우는 NULL로 초기화
int*p=NULL;
  1. 포인터 타입과 변수 타입은 일치해야한다.
    예시) double형 포인터에 int형 변수의 주소를 대입하면 오류

9. 포인터 연산자

  • 증가 연산의 경우, 증가되는 값은 포인터가 가리키는 객체
    예제)
#include <stdio.h>
int main(void) {
	char* pc;
	int* pi;
	double* pd;
    
	pc = (char*)10000;
	pi = (int*)10000;
	pd = (double*)10000;
	printf("증가 전 pc = %d, pi = %d,pd = %d\n", pc, pi, pd);
	
    pc++;
	pi++;
	pd++;
    
	printf("증가 후 pc = %d, pi = %d,pd = %d\n", pc, pi, pd);
	printf("pc+2 = %d, pi+2 = %d,pd+2 = %d\n", pc, pi, pd);
	return 0;
}

10. 간접 참조 연산자와 증감 연산자

  • *p++; : p가 가리키는 위치에서 값을 가져온 후에 p를 증가
  • (*p)++; : p가 가리키는 위치의 값을 증가
    예제 1)
#include <stdio.h>
int main(void) {
	int i = 10;
	int* pi = &i;

	printf("i=%d, pi=%p\n", i, pi);
	(*pi)++; /*pi가 가리키는 위치의 값을 증가*/
	printf("i=%d,pi=%p\n", i, pi);

	printf("i=%d, pi=%p\n", i, pi);
	*pi++; /*pi가 가리키는 위치에서 값을 가져온 후에 pi를 증가*/
	printf("i=%d,pi=%p\n", i, pi);

	return 0;
}

예제 2)

#include <stdio.h>
int main(void) {
	int i = 10;
	int v = 0;
	int* p = &i; // 변수 i의 주소를 포인터 p에 대입

	printf("i=%d,v=%d, p=%p\n\n", i, v,p);
	v = *p++; // p가 가리키는 값을 v에 대입한 후에 p를 증가
	printf("i=%d,v=%d, p=%p\n\n", i, v, p);

	p = &i, v = (*p)++; //p가 가리키는 값을 v에 대입한 후에 가리키는 값을 증가
	printf("i=%d,v=%d, p=%p\n\n", i, v, p);

	p = &i, v =*++p;//p를 증가시킨 후에 p가 가리키는 값을 v에 대입
	printf("i=%d,v=%d, p=%p\n\n", i, v, p);

	p = &i, v = ++*p; // p가 가리키는 값을 가져온 후에 그 값을 증가하여 v에 대입
	printf("i=%d,v=%d, p=%p\n\n", i, v, p);
	return 0;
}

11. 인수 전달 방법

  1. 값에 의한 호출 : 함수로 복사본 전달 (기본)
  2. 참조에 의한 호출 : 함수로 원본 전달

11-1. swap()함수_값에 의한 호출

예제)

#include <stdio.h>

void swap(int x, int y);

int main(void)
{
	int a = 100, b = 200;
	printf("a=%d b=%d\n", a, b);

	swap(a, b);
	printf("a=%d b=%d\n", a, b);

	return 0;
}
void swap(int x, int y) {
	int tmp;
	printf("x=%d y=%d\n", x, y);

	tmp = x;
	x = y;
	y = tmp;

	printf("x=%d y=%d\n", x, y);
}

12. 포인터와 배열

  • 포인터는 배열처럼 사용할 수 있다.
  • 인덱스 표기법을 포인터에 사용할 수 있다.
    예제)
#include <stdio.h>

int main(void)
{
	int a[] = { 10,20,30,40 };

	printf("&a[0]=%u\n", &a[0]);
	printf("&a[1]=%u\n", &a[1]);
	printf("&a[2]=%u\n", &a[2]);

	printf("a=%u\n", a);

	return 0;
}

0개의 댓글

관련 채용 정보