c 포인터 알려주세요 ㅎㅎ
글쓴이
- 2017.03.15. 11:13
- 517
int a, b, *p;
b=&a;
p=&a;
이런상황에서 a변수의 첫번째 주소값이 1이면
b,p 모두 각 변수에 1이 저장이되나요??
그렇다면 굳이 *를 붙이는 이유는 뭔가요??
만약 p에만 1이 저장된다면 이것도 이상한게
&a 값 자체는 1로 상수값이니깐 b에도 저장되야하는거 아닌가요?? 즉, b 와 *p의 차이가 뭔지 잘모르겠네요
주소값은 상수가 아니라 주소값 자체로 따로취급하나요??
b=&a;
p=&a;
이런상황에서 a변수의 첫번째 주소값이 1이면
b,p 모두 각 변수에 1이 저장이되나요??
그렇다면 굳이 *를 붙이는 이유는 뭔가요??
만약 p에만 1이 저장된다면 이것도 이상한게
&a 값 자체는 1로 상수값이니깐 b에도 저장되야하는거 아닌가요?? 즉, b 와 *p의 차이가 뭔지 잘모르겠네요
주소값은 상수가 아니라 주소값 자체로 따로취급하나요??
권한이 없습니다.
0
0
활달한 자두나무
내용 클릭 후 복사하세요.
이 댓글을 삭제하시겠습니까?
[활달한 자두나무]님의 댓글을 신고합니다.
우선, 위의 방식으로 코딩하신다면 b,p에 모두 a의 주소값인 1이 저장되는 것은 맞습니다.
이 때, b=&a; // b는 int타입, &a는 int포인터타입 이지만, 묵시적 타입변환에 의해 &a가 int 타입으로 변환되었기때문에 저장될 수 있는 것입니다.
이 상황만 본다면, 굳이 포인터를 왜쓰지?라는 의문을 가지시는 게 당연할 수 있지만 포인터를 사용하는 목적에 관해 예시를 통해 설명드려보겠습니다.
#include <stdio.h>
int main(void)
{
int a,b,*p;
b=&a;
p=&a;
*b=10; //syntax error
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",p);
return 0;
}
#include <stdio.h>
int main(void)
{
int a,b,*p;
b=&a;
p=&a;
*p=10; //a에 1이 저장됨.
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",p);
return 0;
}
위의 경우와 같이, 주소값을 저장하고 있는 포인터(p)에 *연산자를 사용하면 해당변수를 참조할 수 있습니다. 하지만 b의 경우는 int이므로 *연산자를 사용해서 해당변수를 참조할 수가 없습니다.
단순히 주소값을 저장한다는 개념으로 보면 굳이 포인터를 사용할 필요가 없지만, 주소값을 저장하므로써 나중에 *연산자를 통해 해당 변수를 참조할 수 있다는 점을 생각하시면 왜 포인터를 사용하는가에 대해 조금 감이 오실겁니다.
이 때, b=&a; // b는 int타입, &a는 int포인터타입 이지만, 묵시적 타입변환에 의해 &a가 int 타입으로 변환되었기때문에 저장될 수 있는 것입니다.
이 상황만 본다면, 굳이 포인터를 왜쓰지?라는 의문을 가지시는 게 당연할 수 있지만 포인터를 사용하는 목적에 관해 예시를 통해 설명드려보겠습니다.
#include <stdio.h>
int main(void)
{
int a,b,*p;
b=&a;
p=&a;
*b=10; //syntax error
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",p);
return 0;
}
#include <stdio.h>
int main(void)
{
int a,b,*p;
b=&a;
p=&a;
*p=10; //a에 1이 저장됨.
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",p);
return 0;
}
위의 경우와 같이, 주소값을 저장하고 있는 포인터(p)에 *연산자를 사용하면 해당변수를 참조할 수 있습니다. 하지만 b의 경우는 int이므로 *연산자를 사용해서 해당변수를 참조할 수가 없습니다.
단순히 주소값을 저장한다는 개념으로 보면 굳이 포인터를 사용할 필요가 없지만, 주소값을 저장하므로써 나중에 *연산자를 통해 해당 변수를 참조할 수 있다는 점을 생각하시면 왜 포인터를 사용하는가에 대해 조금 감이 오실겁니다.
1
0
해박한 털도깨비바늘
내용 클릭 후 복사하세요.
이 댓글을 삭제하시겠습니까?
[해박한 털도깨비바늘]님의 댓글을 신고합니다.
해박한 털도깨비바늘
오타가 났는데 *p=10//a에 10이 저장됨 입니다
0
0
해박한 털도깨비바늘
내용 클릭 후 복사하세요.
이 댓글을 삭제하시겠습니까?
[해박한 털도깨비바늘]님의 댓글을 신고합니다.
해박한 털도깨비바늘
눈높이에 맞는 친절한 설명 감사합니다.
추가로 물어보자면
나중엔 a자체를 바꾸는 경우보다
*p를 이용해 a를 바꾸는 경우가 많아서 포인터를 사용하는 일이 많은건가요?
추가로 물어보자면
나중엔 a자체를 바꾸는 경우보다
*p를 이용해 a를 바꾸는 경우가 많아서 포인터를 사용하는 일이 많은건가요?
0
0
글쓴이
내용 클릭 후 복사하세요.
이 댓글을 삭제하시겠습니까?
[글쓴이]님의 댓글을 신고합니다.
글쓴이
늦게 답변드리게 되어 죄송합니다! 이제야 확인했네요~ 포인터를 많이 사용하고 안하고는 프로그램에 따라 차이가 날 수는 있습니다.
다만, 앞서 설명드린 바와 같이 포인터를 사용했을 때, *를 사용하면 해당 변수를 참조할 수 있다는 큰 장점이 있기때문에 포인터를 활용하는 프로그램이 많다고 볼 수 있습니다. 사실상 포인터가 C언어의 가장 큰 매력이라고도 할 수 있죠!
이번 예시를 통해서는 함수에서 call by value(직접 변수의 값을 바꾸려 시도했을 때)와 call by address(포인터를 통해 해당변수를 참조하여 값을 바꾸려 시도했을 때) 결과에서 어떤 차이가 나는지 확인하고 어떤 프로그램에서 포인터가 활용되는지 느낌을 잡으실 수 있으면 좋겠습니다!
//call by value
#include <stdio.h>
void add_one(int a)
{
++a; //main에 있는 변수 a의 값을 바꾸지 못함.
}
int main(void)
{
int a=10;
add_one(a);
printf("%d\n", a);//a=10이 되고 10이 출력됨
return 0;
}
//call by address
#include <stdio.h>
void add_one(int* p)
{
++*p;//main에 있는 변수 a를 참조하여 a의 값을 바꿈.
}
int main(void)
{
int a=10;
int* p;
p=&a;
add_one(p);
printf("%d\n", a); //a=11이 되고 11이 출력됨.
return 0;
}
다만, 앞서 설명드린 바와 같이 포인터를 사용했을 때, *를 사용하면 해당 변수를 참조할 수 있다는 큰 장점이 있기때문에 포인터를 활용하는 프로그램이 많다고 볼 수 있습니다. 사실상 포인터가 C언어의 가장 큰 매력이라고도 할 수 있죠!
이번 예시를 통해서는 함수에서 call by value(직접 변수의 값을 바꾸려 시도했을 때)와 call by address(포인터를 통해 해당변수를 참조하여 값을 바꾸려 시도했을 때) 결과에서 어떤 차이가 나는지 확인하고 어떤 프로그램에서 포인터가 활용되는지 느낌을 잡으실 수 있으면 좋겠습니다!
//call by value
#include <stdio.h>
void add_one(int a)
{
++a; //main에 있는 변수 a의 값을 바꾸지 못함.
}
int main(void)
{
int a=10;
add_one(a);
printf("%d\n", a);//a=10이 되고 10이 출력됨
return 0;
}
//call by address
#include <stdio.h>
void add_one(int* p)
{
++*p;//main에 있는 변수 a를 참조하여 a의 값을 바꿈.
}
int main(void)
{
int a=10;
int* p;
p=&a;
add_one(p);
printf("%d\n", a); //a=11이 되고 11이 출력됨.
return 0;
}
0
0
해박한 털도깨비바늘
내용 클릭 후 복사하세요.
이 댓글을 삭제하시겠습니까?
[해박한 털도깨비바늘]님의 댓글을 신고합니다.
b,p는 모두 주소값을 저장하는것이 맞습니다
*p는 그 주소값에 해당하는 값을 가리키는 반면,(*p==a)
b는 앞에 *을 붙인다 한들 그러한 효력이 없지요. 주소값 그 자체를 가질뿐 그 주소에 해당하는 변수를 참조할 수가 없습니다.
*p는 그 주소값에 해당하는 값을 가리키는 반면,(*p==a)
b는 앞에 *을 붙인다 한들 그러한 효력이 없지요. 주소값 그 자체를 가질뿐 그 주소에 해당하는 변수를 참조할 수가 없습니다.
0
0
상냥한 자금우
내용 클릭 후 복사하세요.
이 댓글을 삭제하시겠습니까?
[상냥한 자금우]님의 댓글을 신고합니다.
이 게시물을 삭제하시겠습니까?






단지 *하나 더 붙었을 뿐이라는 생각을 갖고 계신거 같아요