Dailelog

C_포인터 사용 목적 본문

언어/C언어

C_포인터 사용 목적

Daile 2022. 4. 26. 17:19
#include 
#define NULL (0) 
main()
{
     int a,b;
     int *ap;
     int *bp;

     printf("sizeof(int*) = %d\n",sizeof(int*));
     printf("%d %d %d %d\n",&a,&b,&ap,&bp);
     ap = &a; //&는 a의 주소를 나타냄,주솟값은 정수가 아니다.
     bp = &b;
     //ap =0; 은 아무것도 안가르킨다는 뜻 -> ap = NULL; 그냥 숫자 0을 쓰면 가독성 떨어져서 NULL쓴다
     a = 10;
     b = 20;
     *ap = 100;
     *bp =*bp+200;
     printf("a = %d, b = %d\n",a,b);

     bp = bp +3; //int 단위로 4byte를 3번 더해 bp는 a의 주솟값을 가리키게 된다. 포인터의 연산 덧셉은 역방향이다.b->a
     *bp =1000;  
     // ap = 3930293;는 기본적으로 포인터에 물리적으로 수를 넣거나 연사을 하지마라
     printf("a = %d, b = %d\n",a,b);
     ap = ap-3; //포인터의 뺄셈은 정방향 a->b
     *ap =1000;
     printf("a = %d, b = %d\n",a,b);
}

포인터의 사용 목적 
1.Call by  reference
2.배열과 혼용하기 위해서 
3.Dymamic allocation(동적 할당)
4.사물들 끼리의 관계를 표현하기 위해서
자바과 c#에서는 1.2의 이유로는 사용하지 않는다. 3.4의 목적은 c#과 자바에서 reterence로 대신 사용된다. 4번의 목적은 date structure에서 중요하게 사용되기 때문에 나중에 조금더 자세히 알아볼 예정이다. 

 

&a의 &는 a의 주소를 나타냄,주솟값은 정수가 아니다. addness of a 라고 부른다.

포인터 연산  bp = bp +3;  에서 폰인터 int형 일때 4byte를 3번 더해 bp는 a의 주솟값을 가리키게 된다. 포인터의 연산 덧셉은 역방향이다.b->a

EX)

bp     ap     b     a
1922096     19922084     19922072     1992060

위 그림에서 한칸 4byte이고 아래 숫자가 주소값이라고 했을때 비주얼해서는 프로그램의 안전을 위해 8byte의 공간을 확보하고 메모리에 저장을 시키다. 여기서 1한칸에 4byte이기 때문에 +3 을 하면 bp가 가르키는 주소는 a의 주솟값이 되기 때문에 bp의 값을 변화시키면 a의 값이 변하게 된다. 이러한 방법으로 포인터를 연산하면 지금 작성중인 프로그램 뿐 아니라 다른 운영체제나 프로 그램의 영향을 줄수 있어 예측가능한 상확이 아니라면 사용을 자제 해야 한다. 그리고 절대 포인터 값 자체의 물리적은 수를 넣거나 연산하는 행위는 절대 하지 말자.

LIST

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

C_string_strcmp  (0) 2022.04.27
C_string_strcpy  (0) 2022.04.27
C_string_strlen  (0) 2022.04.25
C_2차원 배열_ 함수 이용(2 Dimensional Array)  (0) 2022.04.22
selection sort  (0) 2022.04.13