搜索
查看: 2037|回复: 15
打印 上一主题 下一主题

学习指针中,这样写为什么会内存错误?

[复制链接]
楼主
发表于 2013-7-17 11:29:42 | 显示全部楼层
因为你没搞清楚一些概念
int(*a)[5]和int*a[5]有什么区别要先想清楚
你要的代码应该是这样子的
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void c(int(*)[5]);
  4. int main()
  5. {

  6. int b[5],i;
  7. c(&b);
  8.    for(i=0;i<5;i++)
  9.    {
  10.    printf("%d",b[i]);
  11.    }
  12.    
  13.    
  14. system("pause");
  15. return 0;
  16. }
  17. void c(int (*a)[5])
  18. {
  19. (*a)[1]=1000;
  20. (*a)[2]=1000;  
  21. (*a)[3]=1000;
  22. (*a)[4]=1000;
  23. (*a)[0]=1000;
  24. }
复制代码
沙发
发表于 2013-7-18 15:10:10 | 显示全部楼层
90°C 发表于 2013-7-18 15:08
我弱弱的问下,之前没有定义过a[5]数组的情况下,*a[5]是没意义的吧?编译器不知道是啥意思吧

你说在哪段代码里面?还是我随手写的那个a[5] ?
板凳
发表于 2013-7-18 15:15:47 | 显示全部楼层
90°C 发表于 2013-7-18 15:11
我说他原来写的那个形参*a[5]

形参列表中的变量相当于声明过了
地板
发表于 2013-7-18 15:28:33 | 显示全部楼层
90°C 发表于 2013-7-18 15:16
我就是想问这么声明的意义是什么  int *a[5]

类形是int **
分析是这么分析的,首先,下标运算符[]的优先度高于间接运算符*,所以首先是a[5],所以a是一个数组,然后数组中的元素经过间接运算*后,类型是int,所以数组中的元素是int *,指向int的指针:
a是一个数组,数组的长度为5
a中元素的类型是int *,指向int的指针
(简而言之,是一个指针数组)

然后,1维的数组经过参数传递,会被转化为指向首地址的指针,数组的长度在这一过程中丢失了,于是int (*)[5]退化成了int **
5#
发表于 2013-7-18 15:29:57 | 显示全部楼层
90°C 发表于 2013-7-18 15:18
编译器会把a[5]作为一个指向整形变量的空间,而不是五个,开辟空间??

如果你是说传参这个过程,编译器会把a的地址拷贝过去,空间就是一个指针的空间,4字节或者8字节
6#
发表于 2013-8-5 17:02:45 | 显示全部楼层
ahwing 发表于 2013-8-5 16:12
麻烦解释下 int(*) 和int * 叫我不用数组的时候第二种成功 谢谢

int (*)和int *没区别
叫我不用数组的时候第二种成功

这句我没看懂
7#
发表于 2013-8-6 18:55:17 | 显示全部楼层
ahwing 发表于 2013-8-6 16:12
我不用数组的时候int * 是可以传递参数的

int b;
c(&b)这样子?

然后你写的c是怎么定义的呢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表