免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gaozhongshan
打印 上一主题 下一主题

数组名字和数组取地址的区别 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-07-27 21:08 |只看该作者
但是好象结构体的名字不是指向那个地址啊   怎么回事呢??

论坛徽章:
0
22 [报告]
发表于 2007-07-27 21:21 |只看该作者

回复 #21 gaozhongshan 的帖子

怎么不是呢? 你看我给的那个代码没有? 如果不是指向那个地址的话, 那几个值又是怎么打印出来的呢?
PS: 以前看老谭的书上写的不能这样打印一个结构体.

论坛徽章:
0
23 [报告]
发表于 2007-07-27 21:32 |只看该作者
你给的代码是&a和a中第一个元素的地址相等,我说的是a表示什么?? 我说的是结构体名字表示什么??&a就是结构体的地址嘛  谁不知道  那结构体a表示什么呢??

论坛徽章:
0
24 [报告]
发表于 2007-07-27 22:47 |只看该作者
原帖由 gaozhongshan 于 2007-7-27 21:32 发表
你给的代码是&a和a中第一个元素的地址相等,我说的是a表示什么?? 我说的是结构体名字表示什么??&a就是结构体的地址嘛  谁不知道  那结构体a表示什么呢??

真是好笑,a代表整个结构体啊
你的名字叫“好笑”,我说“好笑”你就应,那我问你你为什么要应,因为“好笑”代表着你啊。
&"好笑”是类型为结构体的指针,其值为结构体的首地址,它指向整个结构体,就好比你的身份证号码,供公安局的人方便找到你

我下学期学C,暑假开始预学一下,我读了谭老师的第三版,又去本地图书馆找出他的第一、第二版对比着读。然后也看了一些外国的书,我现在对&操作符的理解是:它不只是简单的取得它之后的变量的地址而已,其实它也产生一个指针常量,其类型为操作符后的变量(这个变量可以是复杂变量)类型。用这种方法能理解象&array &struct &array[][n] 之类的东西很容易想通,前天我买了一本《C解惑》,翻到《指针》居然全能看懂。呵。。。。学C真累,也不知有没有用处以后。不过想想当年学五笔,也累,不过似乎难学的东西都能让你终身受益。

[ 本帖最后由 cviolet 于 2007-7-27 23:37 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2007-07-27 22:58 |只看该作者
原帖由 gaozhongshan 于 2007-7-27 21:32 发表
你给的代码是&a和a中第一个元素的地址相等,我说的是a表示什么?? 我说的是结构体名字表示什么??&a就是结构体的地址嘛  谁不知道  那结构体a表示什么呢??

老谭的书对一些容易引起争论的问题他是不会去说的 比如 &array等
有个例子:第一版及第二版 对数组这一节 他是这么写的
“C语言规定只有静态存储数组和外部存储数给才能初始化。”
定义数组时总喜欢加个static
比如 static int[10]={0,1,2,3}; //他注明 第五号元素及之后是默认为0 //static类型确是如此  我注
到了第三版
他不再加static 了。
int[10]={0,1,2,3} ; // 第五及后面的元素值是零,这次他不说staic了
但他把上面那句话给去掉了。不再强调加了static后对于不赋初值的元素默认为“0”
(按他以前的意思,不加static 则不可初始化,即便是初始化,那没有明确指定值的元素是不可知的,也就是说五号及之后元素不可知)
我是去图书馆翻了好久才找到这些话来进行对比的

[ 本帖最后由 cviolet 于 2007-7-27 23:04 编辑 ]

论坛徽章:
0
26 [报告]
发表于 2007-07-27 23:55 |只看该作者
PS: 以前看老谭的书上写的不能这样打印一个结构体.


是不是以前的标准跟现在的不一样了??觉得谭老师的书是不是有点旧了?
也许现用的编译器不如以前的严格了吧?听说都C99了。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
27 [报告]
发表于 2007-07-28 01:29 |只看该作者
呵呵,可以看一看 C专家编程,指针和数组什么时候可以等同,什么时候不可以等同,讲的很清楚

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
28 [报告]
发表于 2007-07-28 04:31 |只看该作者
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int a[10];

  5.     printf("%d\n",sizeof(a));
  6.     printf("%d\n",sizeof(&a));

  7.     getchar();
  8.     return 0;
  9. }
复制代码



gcc  &a //  4byte
vc   &a // 40byte

請問這到底哪個是標準?

謝謝

论坛徽章:
0
29 [报告]
发表于 2007-07-28 21:19 |只看该作者
原帖由 shihyu 于 2007-7-28 04:31 发表
#include

int main(void)
{
    int a[10];

    printf("%d\n",sizeof(a));
    printf("%d\n",sizeof(&a));

    getchar();
    return 0;
}


gcc  &a //  4byte
vc   &a // 40byte

請 ...



gcc中将&a看成是一个指针, 所以是四个字节.
VC中将&a看成是一个数组的整体. 所以仍然是四十个字节.
一个是C编译器, 一个是C++编译器. 还是有区别的.

论坛徽章:
0
30 [报告]
发表于 2007-07-30 10:15 |只看该作者
原帖由 gaozhongshan 于 2007-7-27 19:26 发表
那同样道理对于结构体和联合体来说也是这样
比如
struct   aa{
int a;
char b;
double c;
}
aa和&aa相等但是意义不一样
aa是a的地址,&aa是结构体地址aa+1和&aa+1完全不一样呢?


想在结构里面对元素以偏移取地址
应该以第一个元素为起址的
比如
struct   aa{
int a;
char b;
double c;
}xxx;
对元素b赋值,可以试试
memcpy(xxx.a+sizeof(int),'x',1);
具体没测试,不知道会不会有结构补位长的影响,高手可以不吝赐教。
不过,假如结构里面全部是 char 数组的话,这样用是没问题的,我有个项目中用过
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP