본문 바로가기
반응형

C언어/포인터18

[C언어] 포인터의 뺄셈 포인터의 뺄셈은 아래와 같이 정의됩니다. 포인터 - 포인터 = (값의 차이)/(자료형 크기) 각 자료가 서로 몇 자료형 떨어져 있는지를 알 수 있습니다. 배열에 적용하면 서로 순서가 얼마나 차이나는지 알 수 있습니다. 배열을 예로 들어봅시다. #include int main() { int ar[5]={1,2,3,4,5}; int *p3=&ar[3]; int *p1=&ar[1]; printf("%ld",p3-p1); } 결과가 무엇일지 예측해봅시다. 2로 예측됩니다. int가 4바이트 이므로 a[3] 와 a[1] 의 주소는 8바이트만큼 떨어져 있습니다. 값의 차이는 8이고 자료형 크기는 4이므로 결과는 2입니다. 2022. 7. 20.
[C언어] 자료형이 달라도 포인터의 크기는 같다 포인터는 주소를 저장합니다. 모든 주소는 크기가 같기 때문에 포인터도 크기가 같습니다. 정의 시 자료형은 참조하는 변수의 자료형을 따르지만, 포인터의 크기와는 무관합니다. char, int, double 변수를 참조한 포인터를 정의하고 크기를 확인해봅시다. #include int main() { char a; int b; double c; char *pa=&a; int *pb=&b; double *pc=&c; printf("*pa 의 크기 : %d \n",sizeof(pa)); printf("*pb 의 크기 : %d \n",sizeof(pb)); printf("*pc 의 크기 : %d \n",sizeof(pc)); } 2022. 7. 15.
[C언어] const 와 포인터 아래와 같이 포인터 변수 앞에 const 를 붙이면 어떤 일이 벌어질까요? int a=5; const int *pa=&a; *pa 를 이용하여 a 값을 바꿀 수 없게 됩니다. 아래와 같이 입력할 경우 오류가 발생합니다. *pa=3; 2022. 7. 15.
[C언어] 변수를 그냥 수정하는 것과 포인터로 수정하는 것의 차이 변수와 해당 변수의 주소를 가리키는 포인터를 하나 선언합시다. int a=3; int *pa=&a; 변수의 값은 아래와 같이 두가지 방법으로 수정할 수 있습니다. a=5 *pa=5 차이가 뭘까요? a=5 로 선언할 경우, 만약 다른 함수 안에서 해당 코들르 선언했다면 다른 함수 안에 있는 변수 a가 5로 수정됩니다. 포인터를 사용할 경우 어디에 선언하는지와 상관 없이 우리가 원하는 a를 5로 수정할 수 있습니다. 2022. 7. 15.
[C언어] 함수의 주소를 가리키는 포인터 배열의 이름이 주소이듯, 함수의 이름도 주소입니다. 일반 포인터를 이용하여 함수 이름을 입력해봅시다. #include int add(int a,int b) { return a+b; } int main () { int *pfun; pfun=add; } 오류가 발생합니다. 포인터 변수에 함수 이름을 입력하기 원하는 아래와 같은 형식으로 입력해야 합니다. 반환형 (*포인터이름) 매개변수 위 예시를 이용하여 함수 포인터를 정의해봅시다. #include int add(int a,int b) { return a+b; } int main () { int (*pfun) (int,int); pfun=add; } 2022. 7. 7.
[C언어] 배열포인터 vs 포인터배열 포인터 배열은 포인터 역할을 하는 배열을 말합니다. 원소로 변수의 주소를 가질 수 있습니다. 예시는 아래와 같습니다. #include int main () { int num1=1; int num2=2; int * parr[2]={&num1,&num2}; } 배열 포인터는 배열 이름을 가리키는 포인터입니다. 배열 이름은 곧 배열의 주소이므로, 배열 주소를 가리키는 포인터입니다. 1차원 배열의 경우 일반 포인터 정의방법과 같습니다. #include int main () { int ar[3]={1,2,3}; int *par; par=ar; } 2차원 이상의 배열의 경우 포인터에 1을 더할 때 몇칸씩 이동할지 정해줘야 하므로 아래와 같이 정의하고, 이를 포인터배열이라고 부릅니다. #include int main.. 2022. 7. 7.
[C언어] 배열포인터 (배열을 가리키는 포인터) 1차원 배열은 포인터를 이용하여 배열을 가리킬 수 있습니다. 2차원 이상인 경우 일반 포인터로는 배열을 가리킬 수 없습니다. 이를 이해하는 것이 목적입니다. 먼저 1차원 배열을 하나 만들고 포인터로 가리켜봅시다. #include int main () { int ar[3]; int *par; par=ar; } 오류가 발생하지 않습니다. 이번에는 2행3열의 배열의 이름을 포인터 변수에 입력해봅시다. #include int main () { int ar[2][3]; int *par; par=ar; } 아래와 같은 오류가 발생합니다. ar은 3열을 갖는 배열이라서 포인터 연산을 할 때, 1을 더하면 세칸씩 이동한다는 것을 지정해주어야 합니다. 포인터 연산에서는 1을 더하면 다음 행으로 이동합니다. 다음 행이라는.. 2022. 7. 7.
[C언어] 포인터 연산 (포인터에 1을 더하면?) 아래 예시를 봅시다. 변수 var 을 정의하고, var 주소를 갖는 포인터 pvar을 정의했습니다. pvar에 1을 더한 pvar2 도 정의했습니다. var 과 pvar의 사이즈를 출력했고, pavr과 pavr2 의 주소를 출력했습니다. #include int main () { int var=1; int *pvar=&var; int *pvar2=pvar+1; printf("%ld \n",sizeof(var) ); printf("%ld \n \n",sizeof(pvar) ); printf("%p \n",pvar); printf("%p",pvar2); } 결과는 아래와 같습니다. pvar 은 인트형인데도 길이가 8입니다. 이 길이는 운영체제에 의해 결정됩니다. 주소가 출력된 것을 보면 1을 더했는데 4가 더.. 2022. 7. 7.
[C언어] 포인터의 주소를 저장하는 더블포인터 (포인터의 포인터) 포인터는 어떤 변수의 주소를 저장하는 역할을 합니다. int num=1; int *pnum=# 이때 pnum 에는 num 의 주소가 저장됩니다. pnum 도 변수이므로 주소가 있습니다. pnum 의 주소를 저장하려고 시도해봅시다. int *ppnum=&pnum; 위와 같이 입력하면 오류가 발생합니다. 포이터의 주소를 저장할 때는 *연산자를 두개 입력해야합니다. int **ppnum=&pnum; 2022. 7. 6.
[C언어] 포인터 변수가 일반변수와 다른 점 포인터변수와 일반변수와의 다른 점을 제대로 설명할 수 있어야 포인터변수를 이해한 것입니다. 포인터 변수는 어떤 변수의 주소를 입력받고, 포인터 연산자 * 를 통해서 해당 변수의 값을 받아옵니다. 이런 질문을 할 수 있습니다. 그냥 일반 변수에다가 다른 변수 주소를 입력하는거랑 뭐가 달라? 한 번 해봅시다. 아래와 같이 입력하면 될까요? int A=3; int B=&A; 일단 주소는 int 가 아닙니다. 문자열도 아니라 배열로 입력받을 수도 없습니다. 주소를 입력받을 방법이 없습니다. 포인터가 필요합니다. 2022. 6. 29.
[C언어] 포인터변수에 값을 입력하면 어떻게 될까 아래와 같이 포인터 변수와 포인터변수를 정의합니다 . int num=10; int *pvar=# 이때 *pvar 에 값을 입력하면 어떻게 될까요? *pvar 에만 값이 입력될까요? 아닙니다. *pvar 이 가리키고있는 num 이라는 변수에 값이 입력됩니다. *pvar=3; 이라고 입력하면 num에 3이 입력됩니다. 2022. 6. 28.
[C언어] 포인터 관련 언산자 *와 & 의 이해 * 메모리 공간을 가리키는 연산자입니다. 포인터 변수를 정의하는데도 사용됩니다. int * pvar pvar 은 포인터 변수입니다. 포인터 변수에는 '주소'가 입력됩니다. 아래와 같이 num 이라는 변수의 주소를 포인터변수 pvar 에 입력합니다. int num=3; int * pvar = # &은 주소를 입력하는 연산자입니다. 이때 pvar 에는 num 의 주소가 입력됩니다. 아래 코드를 출력하면 num 의 주소가 출력됩니다. printf("%p",pvar); *pvar 은 pvar 에 입력된 주소에 입력된 값입니다. 아래 코드를 출력하면 3이 출력됩니다. printf("%d",*pvar); 2022. 6. 28.
[C언어] 포인터의 포인터의 포인터 (다중 포인터) 포인터는 삼중 이상의 다중 포인터도 가능합니다. 어떤 변수의 주소를 저장하는 포인터의 주소를 저장하는 포인터의 주소를 저장하는 포인터의 주소를 저장하는.....포인터 아래는 삼중포인터 예시입니다. #include int main(void) { int num=3; int *p_num=# int **p_p_num=&p_num; printf("%p\n",p_num); printf("%p\n",p_p_num); printf("%p\n",*p_p_num); } 2022. 4. 7.
[C언어] 포인터의 포인터 포인터변수는 어떤 변수의 주소를 저장합니다. 포인터변수에도 주소가 있는데요. 포인터 변수의 주소를 저장하는 포인터는 포인터의 포인터입니다. 이를 이중포인터라과 부릅니다. **를 붙여서 정의합니다. #include int main(void) { int num=3; int *p_num=# int **p_p_num=&p_num; printf("%p\n",p_num); printf("%p\n",p_p_num); printf("%p\n",*p_p_num); } 2022. 4. 1.
[C언어] 포인터 변수의 크기는 그냥 포인터의 크기이다 배열의 주소가 저장된 포인터 변수의 크기는 배열의 크기와 다릅니다. 64비트 운영체제에서 포인터 변수의 크기는 8바이트입니다. #include int main(void) { int ar[3]={1,2,3}; int *p_ar=ar; printf("%ld\n",sizeof(ar)); printf("%ld\n",sizeof(p_ar)); } 2022. 3. 31.
[C언어] 포인터 연산의 활용 배열 ar 이 있고, 이 배열 주소를 포인터 p_ar 에 저장했다고 하자. 이때 아래 세 코드의 의미가 같다 . ar[i]==*(ar+i)==*(p_ar+i) ar은 주소이고, i가 더해지면 i번째 요소의 주소가 된다. 해당 주소가 가리키는 값에 * 를 이용하여 접근하면 결국 ar[i] 과 같아진다. 아래는 예시이다. #include int main(void) { int ar[3]={10,20,30}; int *p_ar=ar; printf("%d\n",*(ar+1)); printf("%d\n",*(p_ar+1)); printf("%d\n",ar[1]); } 2022. 3. 31.
[C언어] 포인터의 연산 int 형 포인터에 1을 더하면, 값이 4 증가한다. 크기만큼 증가하는 것이다. double 이라면 8이 증가할 것이다. 아래는 예시이다. #include int main(void) { int num=3; int *p_num=# printf("%p\n",p_num); printf("%p\n",p_num+1); printf("%p\n",p_num+2); printf("%p\n",p_num+3); } 2022. 3. 31.
[C언어] 포인터란 무엇인가 어떤 변수가 정의되면 저장공간을 할당받습니다. 각 저장공간에는 고유한 주소가 있는데요. 이 주소를 저장하는 변수가 포인터변수입니다. 아래는 예시입니다. int main(void) { int num=3; int * pnt_num=# printf("%p \n",pnt_num); printf("%d",*pnt_num); } &는 주소를 가져오는 주소연산자입니다. num의 주소를 가져다가 pnt_num 에 저장하였습니다. 포인터변수를 정의할 때는 *를 붙입니다. 출력할 때 서식문자는 %p입니다. 포인터가 가리키는 주소에 저장된 값을 출력할 때는 * 연산자를 사용합니다. 2022. 3. 30.
반응형