A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Melody_cw 中级黑马   /  2014-7-20 21:44  /  2206 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Melody_cw 于 2014-7-21 10:57 编辑

char *c[3] = {"you", "are", "good"};
char **a;
a = c;
此时的*(a+1)取的是are,,,,,
而*a+1取的是ou,,,
都是按照什么取值的,有点晕

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

9 个回复

倒序浏览
char *c[3]是个复杂声明,要按运算符优先级来解读它到底表示什么。
首先定位标识符,也就是c。c的周围有两个运算符——[]和*。[]的优先级高于*,因此声明相当于:char *(c[3]) 这表明c是一个长度为3的数组。既然知道是数组,下一步就要问数组里装的是什么(数组元素的类型),这是看到char *,于是知道数组里装了3个指向char的指针变量。由大括号中的初始化可知:
c[0] = "you"
c[1] = "are"
c[2] =  "good"

数组名c是指向数组首元素的指针,由于数组元素类型为char *,因此c的类型为char **,即指向char *的指针。所以c可以直接赋值给char **类型的变量a

*(a+1) 等价于数组下标访问a[1],实际上,你程序中写的下标访问全部会被编译器转换为指针形式。二者等价的原因是: a的类型是char **,因此a+1指向下一个字符串的地址,也就是"are"的起始地址,*(a+1)则是一个指向字符"a"的指针类型char *,因此printf("%s", *(a+1))将输出"are"

*a + 1中,a的类型是char **,指向字符串"you"的地址,*a的类型是char *,指向字符"y"。*a + 1则表示char *类型的指针*a向前移动一个字符,指向字符"o",因此printf("%s", *a+1)将输出"ou"

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
fantacyleo 发表于 2014-7-20 22:51
char *c[3]是个复杂声明,要按运算符优先级来解读它到底表示什么。
首先定位标识符,也就是c。c的周围有两 ...

char *c[3] 是不是要分配两个存储空间,一个是给数组C,另一个是给C:\Users\Administrator\Desktop
a = c,c是一个数组里面装的元素是指针
回复 使用道具 举报
fantacyleo 发表于 2014-7-20 22:51
char *c[3]是个复杂声明,要按运算符优先级来解读它到底表示什么。
首先定位标识符,也就是c。c的周围有两 ...

不好意思前面那个发错了
1.用内存分析的话,就是说C里面存的c[0]的地址,c[0]里面存的地址是”you“的地址,
也就是**c指向了*c,也就是c[0]的地址,*c又指向了you,地址是y的地址。最后我是这样理解的

2.还有就是a = c 这里不是太理解,a接受的值是c的地址吗?比如说,如果char *a,char*c,char m ;c = &m;  a = &c;这里就是把指针变量c的地址赋值给了a,如果这里写的是a = c呢?赋值给a的还是c的地址吗?还是把m的地址给了a?
回归到原来题目中的a =  c,它是把什么赋值给了a?

回复 使用道具 举报
fantacyleo 发表于 2014-7-20 22:51
char *c[3]是个复杂声明,要按运算符优先级来解读它到底表示什么。
首先定位标识符,也就是c。c的周围有两 ...

*a + 1中,a的类型是char **,指向字符串"you"的地址,*a的类型是char *,指向字符"y"。*a + 1则表示char *类型的指针*a向前移动一个字符,指向字符"o",因此printf("%s", *a+1)将输出"ou"

这一句我也明白了,因为是cha **a  ,我可以看看做是cha *b ,b ==*a ,*a+1 ==b+1
回复 使用道具 举报
Melody_cw 发表于 2014-7-21 10:31
不好意思前面那个发错了
1.用内存分析的话,就是说C里面存的c[0]的地址,c[0]里面存的地址是”you“的地 ...

1. 正确   2. a=c,无论c是什么,都是把c的值赋给a,而由于c=&m,因此赋给a的是m的地址。原题中的a=c仍然是把c的值赋给a,只不过此时c的值是c[0]的地址。
回复 使用道具 举报
fantacyleo 发表于 2014-7-21 10:42
1. 正确   2. a=c,无论c是什么,都是把c的值赋给a,而由于c=&m,因此赋给a的是m的地址。原题中的a=c仍然 ...

嗯 我懂了,后面可能还会遇到指针的问题,多来几次吧,慢慢解决,谢谢你啊

点评

不用客气^_^  发表于 2014-7-21 10:50
回复 使用道具 举报
Melody_cw 发表于 2014-7-21 10:39
*a + 1中,a的类型是char **,指向字符串"you"的地址,*a的类型是char *,指向字符"y"。*a + 1则表示char ...

嗯,指针加减一个整数的结果,关键是搞清楚指针的类型。不同类型的指针可能指向相同的地址,但对他们"+1"的结果是完全不同的。比如
int c[3] = {1, 2, 3};
int (*p)[3] = &c;
c和p都指向元素1的地址,但是c是int *的指针,c+1就是移动一个int类型的长度,即4个字节。而p是int(*)[3]类型的指针,p+1是移动一个int[3]类型的长度,即4*3个字节
回复 使用道具 举报
fantacyleo 发表于 2014-7-21 10:49
嗯,指针加减一个整数的结果,关键是搞清楚指针的类型。不同类型的指针可能指向相同的地址,但对他们"+1" ...

嗯嗯,谢谢你,回答的很详细。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马