C언어 함수 포인터좀 알려주세요
글쓴이: chobon / 작성시간: 수, 2007/08/29 - 12:44오후
#include
int fu(int *i[]){
printf("a %d\n", *i[0]);
printf("b %d\n", *i[1]);
printf("c %d\n", *i[2]);
*i[0] = *i[1] + *i[2];
printf("%d\n", *i[0]);
return 0;
}
int main(){
int *z;
z = (int*)malloc(sizeof(int)*3);
z[0] = 10;
z[1] = 20;
z[2] = 5;
printf("%d\n", z[0]);
printf("%d\n", z[1]);
printf("%d\n", z[2]);
fu(&z);
printf("%d\n", z[0]);
free(z);
}
기대값은
10
20
5
a 10
b 20
c 5
25
25
가 나와야 할거 같은데 잘 안되네여 ㅡㅡ;;; 초보에게 도움좀 주세요
Forums:
함수 fu 내에서 *i[0] ->
함수 fu 내에서 *i[0] -> (*i)[0] 등으로 모두 수정하시거나(precedence 문제),
꼭 int ** 로 받아야 하는 이유가 없다면, 함수 fu를 int fu(int *) 로 수정하시고,
*i[0] -> i[0] 등으로 수정하시면 되겠네요.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
함수 fu 내에서 *i[0] -> /* 덧붙인 설명 */
윗분 설명은 잘하셨는데 초보자에게 너무 간단하게 설명하셨네요.
저도 초보자지만 자세하게 설명하고 예제를 직접만들어 주면 쉽게 이해되더군요.
C언어에서 배열은 포인터보다 우선순위(Precedence)가 높으니까
포인터에 괄호를 해줘야 오동작이 발생되지 않겠죠.
#include
int fu(int *i[]){
printf("a %d\n", (*i)[0]);
printf("b %d\n", (*i)[1]);
printf("c %d\n", (*i)[2]);
(*i)[0] = (*i)[1] + (*i)[2];
printf("%d\n", (*i)[0]);
return 0;
}
int main(){
int *z;
z = (int*)malloc(sizeof(int)*3);
z[0] = 10;
z[1] = 20;
z[2] = 5;
printf("%d\n", z[0]);
printf("%d\n", z[1]);
printf("%d\n", z[2]);
fu(&z);
printf("%d\n", z[0]);
free(z);
}
상당히 복잡하게 만드셨는데요.
복잡한만큼 디버깅도 어렵고, 유지보수도 어렵습디다요.
윗분의 설명같이 다음과 같이 하셔도 됩니다.
#include
int fu(int *i){
printf("a %d\n", i[0]);
printf("b %d\n", i[1]);
printf("c %d\n", i[2]);
i[0] = i[1] + i[2];
printf("%d\n", i[0]);
return 0;
}
int main(){
int *z;
z = (int*)malloc(sizeof(int)*3);
/* 스트레스 적게 받으려면, 예외처리에 신경습시다. */
if(z == NULL) { printf("Error::Not enough memory. \n"); return 1; }
z[0] = 10;
z[1] = 20;
z[2] = 5;
printf("%d\n", z[0]);
printf("%d\n", z[1]);
printf("%d\n", z[2]);
fu(z); /* 포인터로 호출합니다. */
printf("%d\n", z[0]);
free(z);
return 0; /* 이렇게 하는게 안전하더군요. */
}
혹시 지워졌을까봐서 윗분의 대답도 올립니다.
--------------------------------------------------------------------------------
함수 fu 내에서 *i[0] ->
Submitted by jinyeong on 수, 2007/08/29 - 12:56pm.
함수 fu 내에서 *i[0] -> (*i)[0] 등으로 모두 수정하시거나(precedence 문제),
꼭 int ** 로 받아야 하는 이유가 없다면, 함수 fu를 int fu(int *) 로 수정하시고,
*i[0] -> i[0] 등으로 수정하시면 되겠네요.
--------------------------------------------------------------------------------
함수 fu 내에서 *i[0] -> /* 덧붙인 설명의 추가글. */
HTML로 변한되나 보네요... < >가 안되네
포인터의 사용방식은 여러가지더군요.
int fu(int *i[]){
printf("a %d\n", (*i)[0]);
printf("b %d\n", (*i)[1]);
printf("c %d\n", (*i)[2]);
(*i)[0] = (*i)[1] + (*i)[2];
printf("%d\n", (*i)[0]);
return 0;
}
이렇게 사용하는것 보다는 다음과 같이 하는게 편하던데...
int fu(int *i[]){
printf("a %d\n", *i[0]);
printf("b %d\n", *(i[0] + 1));
printf("c %d\n", *(i[0] + 2));
*i[0] = *(i[0] + 1) + *(i[0] + 2);
printf("%d\n", *i[0]);
return 0;
}
포인터는 사용하다보면 혼란스러울때가 많더군요.
항상 일관성있게 사용하는것이 혼란을 줄여주더군요.
그 일관성에 다른 사람도 많이 쓰는 방식이 선호되고요.
온통 포인터를 사용하는것 보다는 포인터와 배열을 적절하게 분배해서 사용하는것이 디버깅때 스트레스를 줄여주더군요.
아주 흥미로운 글이 있더군요.
초보자와 고급자의 구별을 어떻게 하는가? 하는...
고급자라는것 자체가 이상하게 들리므로
초보자와 고수의 구별을 어떻게 하는가? 가 낫지았았나 싶지만
어쨌든...
초보자와 그이상인 자와의 구별을 어떻게 하는가?
여기에 대답들중 흥미로운 부분이 있어서 덧붙였읍니다.
: : 아무리 왕초보라도 5분만 배우면 프리쉘 할수 있고
: : 몇일후에 보면 스승을 능가하는 경우를 종종 볼수 있습니다.
: : 과연 초보자와 고급자의 구별이 있을수 있을까요?
: :
: : 단지 초보자와 고급자의 구별은 스스로 판단한다고 생각합니다.
: : 10년을 배워도 부족하다고 느끼는 사람은 분명 초보자고
: : 1시간을 배웠어도 이정도면 자신이 쓰는데 아무런 불편함이 업다면
: : 그정도까지는 그도 고수 입니다.
어떻게 보면 지탄받을듯한 내용이지만,
어떻게 보면 맞는 말이더군요.
자신이 초보자라 생각하면 초보자이고, 고수라고 생각하면 고수인것은 맞는것 같습니다.
그러나 초보자와 고수의 차이는 자신이 결정하는것이 아니라
타인의 평가에 의해서 결정되는 경우가 많으므로 정확한 분석은 아닌듯 합니다.
그러나 어쨌든...
1시간을 배워서 고수가 되기보다는 10년을 배워도 초보자이고 싶군요.
영원한 초보자로 겸손하게 또다른 초보자에게서 배움을 찾는 여유있는 초보자가 되고 싶습니다.
오만방자하고 교만한 쪽팔리는 고수보다는 멋지지 않습니까?? ^__^
댓글 달기