본문 바로가기
반응형

포인터22

[C++] 포인터에서 * 연산자의 두 가지 사용법 *연산자는 두가지 경우에 다른 의미로 사용되기 때문에 많은 분들이 헷갈려 합니다. 오늘은 *연산자의 사용방법을 정리해봅시다. 포인터 변수 p를 하나 정의합시다. int a=3; int* p=&a; p라는 포인터에는 a의 주소값이 저장됩니다. 위 코드에서 *연산자는 포인터 변수를 선언할 때 사용되었습니다. *p 라는 변수가 선언된 것이 아니라 (int*) 라는 자료형인 p라는 변수가 선언된 것입니다. p는 int형 포인터상수입니다. 상수라는 이름이 붙은 이유는 변형이 불가능하기 때문입니다. *는 아래와 같은 상황에서도 사용됩니다. *p=5; *p는 p가 가리키는 주소에 입력된 값을 의미합니다. a에 입력된 값인 5입니다. 정리해봅시다. *연산자는 두가지 역할로 사용됩니다. 1) 자료형 뒤에 붙어서 포인터변.. 2022. 8. 12.
[C++] 변수의 주소는 몇 진수일까 포인터를 이용하여 변수의 주소를 하나 출력해봅시다. #include using namespace std; int main() { int a=3; int *p=&a; cout 2022. 8. 11.
[C++] 포인터란 무엇인가 포인터는 변수입니다. 하지만 우리가 일반적으로 알고 있는 변수와는 다릅니다. 이러한 이유 때문에 포인터에 익숙해 지는데 시간이 좀 필요합니다. 지금부터 우리에게 익숙한 변수에서 출발하여 포인터가 무엇인지 배워봅시다. 우리가 일반적으로 알고 있는 변수는 숫자나 문자를 입력할 수 있는 어떤 공간의 이름입니다. 각 변수는 메모리 공간을 갖습니다. 정수형 변수를 선언하고 값을 입력하는 아래 코드를 봅시다. int a=3; 위와 같이 선언할 경우 메모리 공간에 int 자료형의 크기인 4바이트가 할당됩니다. 할당된 4바이트 공간에 3이 입력됩니다. 메모리 공간에서 4바이트 만큼을 정한 뒤 a라는 이름을 붙인 것과 같습니다. 이후 a라는 변수를 사용하게 되는데요. 우리가 a를 사용할 때마다 컴퓨터는 a라는 이름이 붙.. 2022. 8. 11.
[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언어] 배열포인터 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을 더하면?) 아래 예시를 봅시다. 변수 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 arr[5]; arr에는 무엇이 저장될까요. arr에는 첫번째 원소의 주소가 입력됩니다. 따라서 arr의 타입은 포인터형입니다. 이번에는 포인터배열을 하나 정의합시다. 포인터배열의 원소는 변수들의 주소입니다. int *arr2[5] 배열의 이름은 포인터인데, 포인터배열인 arr2의 타입은 무엇일까요? arr2도 첫번째 원소의 주소가 입력될 것입니다. 첫번째 원소는 어떤 변수의 주소일 것입니다. arr2 에는 주소의 주소가 입력된느 것입니다. arr2는 포인터의 포인터, 즉 더블포인터입니다. 포인터배열의 타입은 더블포인터입니다. 2022. 7. 7.
[C언어] 포인터를 이용한 문자열 정의 문자열은 보통 배열을 이용하여 정의하는데, 포인터를 이용하여 정의할 수도 있습니다. 아래와 같이 정의합니다. char * mystr = "Hello World" 이때 mystr 에는 H가 저장된 곳의 주소가 저장됩니다. 아래와 같이 출력하면 주소가 출력됩니다. printf("%p",mystr); Hello World 를 출력하려면 어떻게해야 할까요? 아래와 같이 하면될까요? printf("%s",*mystr); 안됩니다. *mystr 는 H만을 가리킵니다. 따라서 %c로 출력하면 H가 출력됩니다. Hello World 를 출력하려면 아래와 같이 하면 됩니다. printf("%s",mystr); 위와 같이 하면 H주소에 접근해서 널문자가 나올때 까지 문자열을 출력합니다. 2022. 7. 1.
[C언어] 포인터 변수가 일반변수와 다른 점 포인터변수와 일반변수와의 다른 점을 제대로 설명할 수 있어야 포인터변수를 이해한 것입니다. 포인터 변수는 어떤 변수의 주소를 입력받고, 포인터 연산자 * 를 통해서 해당 변수의 값을 받아옵니다. 이런 질문을 할 수 있습니다. 그냥 일반 변수에다가 다른 변수 주소를 입력하는거랑 뭐가 달라? 한 번 해봅시다. 아래와 같이 입력하면 될까요? int A=3; int B=&A; 일단 주소는 int 가 아닙니다. 문자열도 아니라 배열로 입력받을 수도 없습니다. 주소를 입력받을 방법이 없습니다. 포인터가 필요합니다. 2022. 6. 29.
[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. 1.
[C언어] 함수의 인자로 배열을 입력받을 때 다른 형태의 선언 함수의 인자로 배열을 입력받을 때 아래와 같이 한다고 배웠습니다. void PrintArr(int *p_ar) *연산자로 포인터변수를 선언해서 배열의 주소를 가져오는 것인데요. 아래와 같이 선언해도 됩니다. void PrintArr(int p_ar[ ] ) p_ar[ ] 을 다른 경우에 사용할 수는 없습니다. 함수의 인자로 받는 경우만 가능합니다. 2022. 3. 31.
[C언어 함수의 인자로 배열 입력받기 배열의 값을 함수 인자로 넣는 것을 불가능하다. 포인터 변수를 이용하여 배열 인자의 주소값은 받을 수 있다. 입력받은 주소값을 이용하여 배열의 값에 접근하는 것은 가능하다. 아래 예시는 배열의 주소를 입력받아 배열 값을 출력하는 함수이다. #include void PrintArr(int *p_ar,int length) { int i; for(i=0; i < length; i++) { printf("%d\n",p_ar[i]); } } int main(void) { int ar[3]={1,2,3}; PrintArr(ar,sizeof(ar)/sizeof(int)); } 2022. 3. 31.
[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언어] 포인터 배열 포인터를 배열 형태로 만드는 것도 가능하다. 배열의 각 요소는 주소값을 갖는다. #include int main(void) { int num1=1; int num2=2; int num3=3; int *ar[3]={&num1,&num2,&num3}; printf("%p\n",ar[0]); printf("%d\n",*ar[0]); printf("%p\n",ar[1]); printf("%d\n",*ar[1]); } 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=&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 ar[2]={10,20}; int *p_ar=ar; printf("%p\n",p_ar); printf("%d",p_ar[0]); } 배열 ar 을 p_ar 에 입력하면 배열 ar의 주소가 포인터변수 p_ar에 할당됩니다. 배열 ar 자체가 주소였는데, p_ar 도 같은 주소이므로 p_ar 을 ar처럼 사용할 수 있게 된 것입니다. 2022. 3. 30.
[C언어] 포인터란 무엇인가 어떤 변수가 정의되면 저장공간을 할당받습니다. 각 저장공간에는 고유한 주소가 있는데요. 이 주소를 저장하는 변수가 포인터변수입니다. 아래는 예시입니다. int main(void) { int num=3; int * pnt_num=&num; printf("%p \n",pnt_num); printf("%d",*pnt_num); } &는 주소를 가져오는 주소연산자입니다. num의 주소를 가져다가 pnt_num 에 저장하였습니다. 포인터변수를 정의할 때는 *를 붙입니다. 출력할 때 서식문자는 %p입니다. 포인터가 가리키는 주소에 저장된 값을 출력할 때는 * 연산자를 사용합니다. 2022. 3. 30.
반응형