포인터 핵심 정리

Sirius·2024년 2월 18일
  • 포인터 : 주소값의 저장을 목적으로 선언되는 변수

  • & 연산자: 해당 피연산자의 주소값을 반환한다.(포인터 변수에 저장 가능)

int num = 7;
int * pnum;
pnum = #


  • 배열의 이름은 포인터이다. 즉 배열은 주소값을 변경할 수 없는 포인터이다.
int arr[3] = {0, 1, 2};
printf("배열의 이름: %p \n", arr); //배열의 이름: 0012FF50
printf("첫번째 요소: %p \n", &arr[0]); //첫번째 요소: 0012FF50

따라서 배열의 이름도 포인터이기에 배열의 이름을 피연산자로 하는 * 연산이 가능한 것이다.

  • arr[i] == *(arr+i)


  • 변수 형태의 문자열 vs 상수형태의 문자열
char str1[] = "My String" // 변수 형태의 문자열
char * str2 = "Your String" // 상수 형태의 문자열



  • 포인터배열 : 포인터 변수로 이루어진 배열

    문자열은 저장된후 "무조건" 주소값이 반환된다.

int * arr1[20];
char * strArr[3] = {"Simple", "String", "Array"};



함수에서 배열을 인자로 전달할때 "주소값"을 전달한다.
이하 2개와 같이 인자로 받을 수 있다.
void access_array(int * param)
void access_array(int param[])

void access_array(int * param){
	int i=0;
    for(i=0; i<len; i++)
    	printf("%d", param[i]);
    printf("\n");
}
int main(void){
	int arr1[3]= {1, 2, 3};
	access_array(arr1)
}
  • Call by value vs Call by reference (함수의 인자)
    Call by Value는 함수의 인자로 단순히 값을 전달하는 것에 비해 Call by reference는 함수의 인자로 주소값을 전달한다.(ex> scanf 함수의 호출)

왜 scanf("%s", &str);을 하지 않을까? str은 문자열 즉 배열이기에 str이름자체가 그 주소이다.
따라서 scanf("%s", str);이 맞는 표현이다.

  • 구조체 변수와 포인터
struct point
{
	int xpos;
    int ypos;
}

int main()
{
	struct point pos1 = {1, 2};
    struct point * pptr = &pos1;
    
    printf("[%d, %d] \n", (*pptr).xpos, pptr->xpos); // 똑같은 값
}

(*pptr).xpos == pprt->xpos

0개의 댓글