본문 바로가기
Language/C

C언어 포인터

by 천뱅 2024. 10. 2.

 
변수의 기본적인 선언
변수가 정수형일 때 int v = 42;
변수가 문자열일 때 (여러문자와 '\0') char str[] = "Hello!";
변수가 배열일 때 int arr[] = {1,2,3,4,5};
 
&(ampersand, 앰퍼센드) - 이 변수의 메모리 상의 주소가 뭐니?
* (asterist, 애스트러스크)  - 그 주소가 가리키고 있는 값을 가져와라 
 
변수 출력의 의미
int answer = 42;
printf("%d\n", answer);  - answer변수를 "십진수\n" 형태로 출력하라 (%d의  d는 decimal)
printf ("%d\n", &answer); - answer변수가 저장되어있는 메모리 주소를 출력하라
 

#include <stdio.h>

int main(){
	int n = 42;
    int *p = &n;
    
    printf("%d\n", &n);
    printf("%d\n", p);
    printf("%d\n", *p);
}
/*
출력값:
EW1231249aAS (n의 주소값 가정)
EW1231249aAS 
42
*/

 
 
포인터 변수는 변수 앞에 *(애스터러스크)를 붙여서 만들 수 있음 
* (애스터러스크) 로 만든 포인터 변수가 저장하고 있는 주소의 실제 값을 출력할 때 다시 *를 써서 출력해야함
 
중요 !!
포인터변수는 태어날 때 쓰인 별과 사용할 때 별을 다르게 해석해야함......
 
 
배열과 문자열은 &를 붙이지 않아도 알아서 주소값을 할당한다. 
배열의 첫번째 요소와 포인터가 가리키는 값은 같다 = 포인터는 배열의 첫번째 요소를 가리키고 있다

#include <stdio.h>

int main() {
    
    int array[] = {10,20,30,40,50};
    int *p = array;
    
    printf("배열의 첫번째 요소 :%d\n", array[0]);
    printf("포인터가 가리키는 값: %d\n", *p);
    
    if(*p == array[0]){
    	printf("배열의 첫번째요소와 포인터가 가리키는 값은 같다");
    }else{
    	printf("배열의 첫번째요소와 포인터가 가리키는 값은 다르다");
    }
}

 
포인터의 값이 1 증가하면 가리키는 요소가 다음으로 이동한다.

#include <stdio.h>

int main() {
    
    char str[] = "Hello, World";
    char *p = str;

    while (*p != '\0') {
        printf("%c", *p);
        p++;
    }
  }
  /*
  출력 :
  Hello, World
  */

 
 
포인터로 값을 변경하면 어떻게 될까

#include <stdio.h>

int main() {
    
    int value = 1;
    int *p = &value;

    //pointer로 값을 변경할 때
    *p = 3;

    printf("%d\n", *p);
    printf("%d", value);
    
}
/*
출력 :
3
3
*/

 
 
문자열과 문자, 정수 출력
문자열과 배열은 포인터에 주소값을 넣을 때 &를 붙이지 않는 것처럼 출력할 때도 *(애스터러스크)를 사용하지 않는다

#include <stdio.h>


void prints(char *str){
    printf("입력 : %s\n", str);
}

void prints2(char *ch){
    printf("입력 : %c\n", *ch);
}

void printd(int *value){
    printf("입력 : %d\n", *value);
}


int main() {
    
    int value = 1;
    char ch = 'A';
    char str[] = "this is String";
    char str2[] = {'A', 'P', 'P', 'L', 'E', '\0'};
    
    prints(str);
    prints(str2);
    prints2(&ch);
    printd(&value);
    return 0;
    
}

/*
입력 : this is String
입력 : APPLE
입력 : A
입력 : 1
*/

 
배열의 포인터가 가리키는 위치 이동 방법

#include <stdio.h>


double avgArray(int *arr, int size){
    int sum = 0;
    int sum2 = 0;
    
    for (int i = 0; i < size; i++){
        sum += arr[i];
    }
    for (int i = 0; i < size; i++){
        sum2 += *arr;
        arr++;
    }
    
    printf("배열의 평균값은 %.2f입니다.\n", (double)sum2/size);
    return (double)sum/size;
}

int main() {
    
    int myArray[] = {100, 22, 34, 55, 70};
    int size = sizeof(myArray)/ sizeof(myArray[0]);
    
    printf("배열의 평균값은 %.2f입니다.\n", avgArray(myArray,size));
    return 0;
}

/*
배열의 평균값은 56.20입니다.
배열의 평균값은 56.20입니다.
*/

 

구조체와 포인터

#include <stdio.h>
#include <string.h>

struct Bag{
    char brand[50];
    int year;
    float price;
};
void printBag(struct Bag *bag){
    printf("Brand : %s\n", bag -> brand);
    printf("year : %d\n", bag -> year);
    printf("price : %.2f\n", bag -> price);
}

int main() {
    struct Bag myBag;
    struct Bag *bagPtr = &myBag;

    strcpy(bagPtr -> brand,"Gucci"); //혹은
    
    char name[] = "Chanel";
    strcpy(bagPtr -> brand,"Gucci");
    for (int i =0; name[i] != '\0'; i++ ) {
        bagPtr->brand[i] = name[i];    
    }
    
    bagPtr->year = 2021;
    bagPtr->price = 45000.11;

    printBag(bagPtr);

    return 0;
}

/*
Brand : Chanel
year : 2021
price : 45000.11
*/

 

 

아스키 코드와 포인터

#include <stdio.h>

int main() {
    char *p = "KOREA";
    printf("%s\n", p);
    printf("%s\n", p+1);
    printf("%c\n", *p);
    printf("%c\n", *(p+3));
    printf("%c\n", *p+4);
    printf("%d\n", *p+4);
    return 0;
}

/*
KOREA
OREA
K
E
O 
79

*p가 가리키는 문자는 'K'
아스키코드상 문자 'K' 에서 4번째 뒤에 있는 문자는
KLMN'O'
A = 65
 A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P
65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80
*/

 

'Language > C' 카테고리의 다른 글

C언어 함수  (0) 2024.10.02