프로그래밍

C언어 포인터에 대한 정리

C언어
반응형

(까먹을까봐 기록하는 C언어 포인터)

 

포인터는 메모리에 직접 접근이 가능하게 합니다.

포인터 변수는 주솟값을 저장하고 있습니다.

 

포인터

#include <stdio.h>
int main (){
	int num =10; //정수 선언
	int *p; //포인터 선언
	p = &num; //포인터 p에 num의 주소 저장
	
	printf ("num:%d\n",num); //num출력
	printf ("&num:%d\n",&num); //num의 주소 출력
	printf ("p:%d\n",p); //p가 가지고 있는값 즉 num의 주소 출력
	printf ("*p:%d\n",*p); // *p가 가르키는 값 즉 num에 들어 있는 값
	printf ("&p:%d\n",&p); //포인터 p가 저장되어 있는 값
}

실행 결과

num:10
&num:6487580
p:6487580
*p:10
&p:6487568

 

#include <stdio.h>
int main (){
	char *p;
	p = "hello world";
	
	printf ("%d\n",p); 
	printf ("%c\n",*p); 
	printf ("%d\n",&p); 
}

실행 결과

4210688
h
6487576

함수의 포인터

#include <stdio.h>
int add (int a, int b){
	return a+b;
}
int main (){
	int (*p)(int,int); //포인터형식으로 함수 선언
	p = add; //선언된 방식으로 이미 만들어둔 함수 지정
	
	printf ("%d\n",p(3,4)); //p에 저장된 함수로 실행
	printf ("%d\n",&p); //p의 주소
	printf ("%d\n",add(3,4)); // 그냥 add를 바로 불러 실행
    printf ("%d\n",p); //p에 저장된 값 (add의 주소)
	printf ("%d",&add); //add의 주소
}

실행결과

7
6487576
7
4199728
4199728
#include <stdio.h>
void fun (){
	printf ("Hello world!\n");
}
int main (){
	void (*p)();
	p = fun;
	
	p(); //p에 저장된 fun 실행
	(*p)(); //p가 가르키는 fun 실행
	fun(); //fun실행
}

배열의 포인터

#include <stdio.h>
int main (){
	int arr [4] ={1,2,3,4};
	int *p;
	p = arr;
	
	printf ("%d\n",p); 
	printf ("%d\n",&arr[0]); //p가 가르키는 것은 배열의 첫번째 주소
	printf ("%d\n",*p); //p가 가르키는 arr[0]이 가지고 있는 값 1 출력
	
	printf ("%d\n",p+1); 
	printf ("%d\n",&arr[1]); //p+1을 할 경우 배열 다음 칸의 주소를 카르킴
	printf ("%d\n",*p+1);
}

실행결과

6487552
6487552
1
6487556
6487556
2

 

#include <stdio.h>
int main (){
	char *arr[3]; //char 자료형을 가르킬 수 있는 포인터들의 배열 선언
	arr [0] = "Hello"; //arr[0] 포인터가 가르키는 문자열
	arr [1] = "World"; //arr[1] 포인터가 가르키는 문자열
	arr[2] ="OH!!"; //arr[2] 포인터가 가르키는 문자열
	
	printf ("%d\n",arr[0]); //배열에 저장된 주소
	printf ("%c\n\n",*arr[0]); // 주소가 가르키는 문자열의 첫번째 글자
	
	printf ("%d\n",arr[1]);
	printf ("%c\n\n",*arr[1]);
	
	printf ("%d\n",arr[2]);
	printf ("%c\n\n",*arr[2]);
	
	printf ("%d\n",arr[0]+1); 
	printf ("%c\n\n",*(arr[0]+1)); //arr[0]이 가르키는 문자열의 두번째 글자
	
	printf ("%d\n",arr[0]+2);
	printf ("%c\n\n",*(arr[0]+2)); //arr[0]이 가르키는 문자열의 세번째 글자
}

 

실행 결과

4210688
H

4210694
W

4210700
O

4210689
e

4210690
l

 

 

#include <stdio.h>
int main (){
   char *arr[6] = {"a","d","g","j","n"};
   
   printf ("%d\n",arr[0]);
   printf ("%c\n",*arr[0]);
   
   printf ("%d\n",arr[0]+1); //그냥 arr[0]의 주소값에서 +1 된것
   printf ("%d\n",arr[1]);
   printf ("%c\n",*arr[0]+1); //a(97) +1 = b (98)
   printf ("%c\n",*arr[1]);
   
   printf ("%d\n",arr[0]+2); //그냥 arr[0]의 주소값에서 +2 된것
   printf ("%d\n",arr[2]);
   printf ("%c\n",*arr[0]+2); //a(97) +2 = c (99)
   printf ("%c\n",*(arr[0]+2)); //하지만 이에 해당하는 주소를 가지고 있다면 그 값이 출력됨
   printf ("%c\n",*arr[2]);
}

실행 결과

4210688
a
4210689
4210690
b
d
4210690
4210692
c
d
g
반응형

'C언어' 카테고리의 다른 글

C언어로 가위바위보 게임 만들기  (0) 2025.04.06
C언어로 업다운 게임 만들기  (0) 2019.10.06