- 主题:关于指针,请大家看看这两段简单程序哪个有问题?
有问题的点我是真的没想明白。
第1段
int *test(int* b)
{
return b;
}
int main()
{
int a=20;
int* pa;
pa=&a;
int* p;
p=test(pa);
printf("%d\n",*p) ;//
return 0;
}
第2段
int *test(int b)
{
return &b;
}
int main()
{
int a=20;
int* p;
p=test(a);
printf("%d \n",*p) ;
return 0;
}
--
FROM 111.193.230.*
函数是区分形参、实参的
int *test(int b)
{
return &b;
}
这个获取的是形参b的地址,而不是传入的实参a的地址。a的值传给了b,但是a、b是两个不同的int变量。
第二个是函数返回了栈上临时变量的地址,任何时候都不要这么做
底层的细节要彻底搞清楚,绝大多数看看汇编代码就一目了然
--
修改:z16166 FROM 61.48.130.*
FROM 61.48.130.*
感谢大佬从原理进行的讲解
但是如果我需要一个函数对数组进行处理,并返回一个新数组该如何处理呢?比如下面
这个错误程序把数组每一项都减5
int* test(int* b)
{
int i;
int *p;//无地址的野指针?
for(i=0;i<5;i++)
{
*(p+i)=*(b+i)+10;
}
return p;
}
int main()
{
int arr[5]={1,2,3,4,5};
printf("%d \n",*arr) ;
int* pa;
pa=test(arr);
printf("%d \n",*pa) ;
return 0;
}
【 在 z16166 的大作中提到: 】
: 函数是区分形参、实参的
: int *test(int b)
: {
: ...................
--
FROM 111.193.230.*
你这程序简直荒谬
【 在 sqsl 的大作中提到: 】
: 感谢大佬从原理进行的讲解
: 但是如果我需要一个函数对数组进行处理,并返回一个新数组该如何处理呢?比如下面
: 这个错误程序把数组每一项都减5
: ...................
--
FROM 117.30.83.*
这两程序感觉都没啥问题呀。
你怎么了?
【 在 sqsl 的大作中提到: 】
: 有问题的点我是真的没想明白。
: 第1段
: int *test(int* b)
: {
: return b;
: }
: int main()
: {
: int a=20;
: int* pa;
: pa=&a;
: int* p;
: p=test(pa);
: printf("%d\n",*p) ;//
: return 0;
: }
: 第2段
: int *test(int b)
: {
: return &b;
: }
: int main()
: {
: int a=20;
: int* p;
: p=test(a);
: printf("%d \n",*p) ;
: return 0;
: }
--
FROM 27.38.197.*
新数组一般要动态分配内存,或者传已有的数组的指针进去。
p = (int *) malloc(5 * sizeof(int));
你是在自己揣摩,还是看了啥不好的教程
【 在 sqsl 的大作中提到: 】
: 感谢大佬从原理进行的讲解
: 但是如果我需要一个函数对数组进行处理,并返回一个新数组该如何处理呢?比如下面
: 这个错误程序把数组每一项都减5
: ...................
--
修改:z16166 FROM 61.48.130.*
FROM 61.48.130.*
他把参数地址给返回了
【 在 flw 的大作中提到: 】
: 这两程序感觉都没啥问题呀。
: 你怎么了?
:
--
FROM 120.36.200.*
说的是第二个吧。
第一个呢
【 在 slowaction 的大作中提到: 】
: 他把参数地址给返回了
--
FROM 27.38.197.*
我在B站学的教程,不知道课是怎么排的,前面先粗略的讲了一遍,所以你看我把青蛙跳
台阶、汉诺塔等课后习题都做了,结果最近那老师又回过头来细讲数组、指针什么的。
然后我才觉得自己原来写程序都是囫囵吞枣,有了很多疑问和新的认识。
【 在 z16166 的大作中提到: 】
: 新数组一般要动态分配内存,或者传已有的数组的指针进去。
: p = (int *) malloc(5 * sizeof(int));
: 你是在自己揣摩,还是看了啥不好的教程
: ...................
--
FROM 111.193.230.*
第1个特别神奇
我之前运行的时候不报错,但是不打印20,程序就运行结束了。
后来我在test函数中加了一个打印,再运行程序就可以打印出2个20了,去掉test中的p
rintf就不行。
int *test(int* b)
{
printf("%d\n",*b) ;
return b;
}
int main()
{
int a=20;
int* pa;
pa=&a;
int* p;
p=test(pa);
printf("hhahaaaa\n") ;
printf("%d\n",*p) ;//
return 0;
}
但是我今天试,已经没有任何问题了,百思不得其解
【 在 flw 的大作中提到: 】
: 说的是第二个吧。
: 第一个呢
--
FROM 111.193.230.*