pointer

ChoRong0824·2022년 10월 13일
0

C

목록 보기
6/17

포인터란? 생각보다 이건 단순함.
* asterisk 란, 2가지의 큰 의미를 가짐.
1. 포인터를 선언할 때 사용.
2. 해당 주소에 값이 접근하는 용도로 쓰임.

1번

#include<stdio.h>
int main(){
    int *p1; //pointer initialize.
    int a =10; // a initialize.
    p1=&a; // a adress join to p1

    printf("a의 주소 =%u\n", &a);
    printf("p1의 주소 = %u p1의 내용, a의 주소 =%u\n",&p1, p1 );
    printf("%u %u %u\n\n", &(*p1), &(*(p1+1)), &(*(p1+2)));
    printf("간접 참조 *p1을 지정하면 %d이 표시된다.\n", *p1);
}

return 0; // int 형으로 작성시 return 값 설정


2번
#include<stdio.h>
int main(){
    char *p1;
    p1 ="PAK";
    
    printf("p1의 주소 =%u %d p1의 내용 %u\n", &p1,&p1, p1);
    printf("%u %u %u\n", &(*(p1)), &(*(p1+1)), &(*(p1+2)));
    printf("%c %c %c\n", *p1, *(p1+1), *(p1+2));
    printf("%c %c %c\n", p1[0], p1[1],p1[2]);
    return 0;
}

3번
#include<stdio.h>
int main(){
   
    char *d ="12345";
    printf("%c,,%s\n", *d, d);

    d = d+1;

    printf("%c,, %s\n", *d,d);
    printf("%c,, %c\n", *(d-1), *(d+1));

    return 0;
}

4번
#include<stdio.h>
int main(){
   
    int a[]={1,2,3,4};
    int *p;
    int i,sum =0;

    p=a;
    // 이렇게 처리하면 사실상 int *p=a 이렇게 초기화 하는 거 아닌가?
    for(i=0;i<4;i++, p++){
        sum+= *p;
        printf("a[%d]의 주소 = %x\n", i ,p);
    }
    printf("\n배열의 원소의 합 =%d\n",sum);
    
    
}

5번
#include<stdio.h>
void swap(int *num1,int *num2){
    int temp;
    //swap
    
    temp= *num1;
    *num1= *num2;
    *num2= temp;
}

int main(){
    //a 와 b의 위치 스왑
    int a =5;
    int b=10;

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

    swap(&a,&b);
    printf("\n\nafter swap\n\n");
    printf("a=%d\nb=%d",a,b);
    return 0;
}

6번

#include<stdio.h>
int main(){
    char arr[6]={"hello"};

    char* ptr;
    // arr 자체는 값을 가지고 있는 중임.
    // arr[n]; <--- n번째 값을 가지고 있는 것임.
    
    ptr= &arr[0]; 
    // printf("%c", ptr[1]) 이런식으로 배열의 인덱스로 접근을 해주어도 지목을 한 arr처럼 접근함
    // 아래처럼 *로 접근 할 수도 있음.
    printf("%c", *(ptr+4));
    // *로 접근할 경우 *(ptr+1)로 접근해주면 됌.
    // ptr +1로 작성하게 된다면, *는 맨 앞의 배열을 읽음.
    //  근데 +1을 해주면 2번째가 나올 것 같지만 연산자의 우선순위 때문에, *먼저 연산함,
    // 한마디로 위에 주석처리 한 것처럼 하게된다면 *ptr 의 주소를 뽑아내고 이 주소에 +1 한 것을 보여준다고 보면됌.
    // pointer는 arr와 같이 사용해주면 좋음
    

    return 0;
}

7번
#include<stdio.h>
int main(){
    int *p1, a[2];
    float *p2, b[2];

    p1=a;
    p2=b;

    printf("p1의 주소 : %u\np2 주소 :%u\n", &p1, &p2); //주소값 printf 3개 출력.
    printf("p1의 값:%u\np2의 값:%u\n",p1,p2);
    printf("a  주소:%u\nb  주소:%u\n", &a,&b);

    *p1=1; // p1 이 가리키는 주소의 내용을 저장하고,a[0]에는 1저장/
    *(p1+1)=2; // p1+1 즉, a[1]에는 2를 저장.
    *p2 = (float)1.5; // p2이 가리키는 주소. b[0]에 1.5 저장
    *(p2+1)=(float)2.5; // p2+1 즉, b[1]에 2.5 저장.

    printf("%6d%6d%6.1f%6.1f\n", *p1, *(p1+1),*p2,*(p2+1)); //포인터 p1 출력 -> 1, 
    printf("%6d%6d%6.1f%6.1f\n",a[0],a[1],b[0],b[1]);
    printf("%6d%6d%6.1f%6.1f\n",p1[0],p1[1],p2[0],p2[1]);

    return 0;
}

8번
#include<stdio.h>
int main(){
    int *p1, a[2];
    float *p2, b[2];

    p1=a;
    p2=b;

    printf("p1의 주소 : %u\np2 주소 :%u\n", &p1, &p2); //주소값 printf 3개 출력.
    printf("p1의 값:%u\np2의 값:%u\n",p1,p2);
    printf("a  주소:%u\nb  주소:%u\n", &a,&b);

    *p1=1; // p1 이 가리키는 주소의 내용을 저장하고,a[0]에는 1저장/
    *(p1+1)=2; // p1+1 즉, a[1]에는 2를 저장.
    *p2 = (float)1.5; // p2이 가리키는 주소. b[0]에 1.5 저장
    *(p2+1)=(float)2.5; // p2+1 즉, b[1]에 2.5 저장.

    printf("%6d%6d%6.1f%6.1f\n", *p1, *(p1+1),*p2,*(p2+1)); 
    //포인터 p1 a[0]값 출력 -> 1, 포인터 p1의 a[1],
    // 포인터가 가리키는 배열 b[0]을 값을 출력, 포인터 p2가 가리키는 b[1]의 값을 가짐.
    printf("%6d%6d%6.1f%6.1f\n",a[0],a[1],b[0],b[1]);
    // a[0~1],b[0~1] 의 값을 출력.
    printf("%6d%6d%6.1f%6.1f\n",p1[0],p1[1],p2[0],p2[1]);
    // p1[0~1], p2[0~1] 의 값을 출력. 
    // p1의 배열을 출력하는데. 왜 위에 a와 b의 배열이랑 같냐?  이건 단순함.
    // pointer (*)란. 2가지의 큰 의미를 가짐. 1. 포인터를 선언할 때 사용. 2. 해당 주소에 값이 접근하는 용도로 쓰임.
    return 0;
}
profile
컴퓨터공학과에 재학중이며, 백엔드를 지향하고 있습니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글