Dailelog
C_포인터 사용 목적 본문
#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 |