看这2个C程序,关于指针和数组的
main(){charstr[][10]={"China","Beijing"},*p=*str;printf("%s\n",p+10);}我知道输出结果是Bei...
main() {char str[][10]={"China","Beijing"},*p=*str; printf("%s\n",p+10); } 我知道输出结果是Beijing。但是不是特别明白,p指向的是str[0][0]啊,还是指向的str[0]?希望详细地解释一下。 main(){ char *p[10]={“abc”,”aabdfg”,”dcdbe”,”abbd”,”cd”}; printf(“%d\n”,strlen(p[4])); } 这个我知道是输出2,是“cd”的长度。但是不是太明白p[10]看起来是一维数组,怎么会像二维数组赋值的方式给它赋值呢? 以上两个题能回答几道就回答几道。
展开
1个回答
展开全部
第一个问题:
这里,p存的是二维数组str的首元素的首地址,也就是指向str[0][0]。
p是个char
*,即指向的对象存的是char类型,所以p+10就是从p指向的位置str[0][0]向后移动了10个char单位。
二维数组定义为str[][10],可以看做是n个一维数组,每个一维数组有10个字符。这里初始化的时候将第一个一维数组初始化为"China",第二个初始化为"Beijing",所以P+10向后移动10个单位后,p就指向了‘B’,所以输出为Beijing。
比如这里不是p+10,而是p+3,那么就向后移动了3个char,指向了‘n’,此时输出就为na。
第二个问题:
首先,要搞清楚,char
*p[10]是什么,由于[
]的优先级比*高,故p是先和[
]组合,
所以,这里char
*p[10]其实是定义了一个指针数组,p是个数组,数组的每个元素都是一个指向char类型的指针,这里定义的时候进行了初始化,将10个指针分别指向了那几个字符串,
char
*ptr
=
"abcde";
这个应该理解吧,就是将一个指针指向一个字符串,
char
*p[10]={“abc”,”aabdfg”,”dcdbe”,”abbd”,”cd”};一样,不过是定义了10个指针,这10个指针是个数组,每个指针指向一个字符串。
所以p[4]就是指数组的第5个元素,它也是个指针,指向字符串"cd",所以strlen(p[4])=2
这里,p存的是二维数组str的首元素的首地址,也就是指向str[0][0]。
p是个char
*,即指向的对象存的是char类型,所以p+10就是从p指向的位置str[0][0]向后移动了10个char单位。
二维数组定义为str[][10],可以看做是n个一维数组,每个一维数组有10个字符。这里初始化的时候将第一个一维数组初始化为"China",第二个初始化为"Beijing",所以P+10向后移动10个单位后,p就指向了‘B’,所以输出为Beijing。
比如这里不是p+10,而是p+3,那么就向后移动了3个char,指向了‘n’,此时输出就为na。
第二个问题:
首先,要搞清楚,char
*p[10]是什么,由于[
]的优先级比*高,故p是先和[
]组合,
所以,这里char
*p[10]其实是定义了一个指针数组,p是个数组,数组的每个元素都是一个指向char类型的指针,这里定义的时候进行了初始化,将10个指针分别指向了那几个字符串,
char
*ptr
=
"abcde";
这个应该理解吧,就是将一个指针指向一个字符串,
char
*p[10]={“abc”,”aabdfg”,”dcdbe”,”abbd”,”cd”};一样,不过是定义了10个指针,这10个指针是个数组,每个指针指向一个字符串。
所以p[4]就是指数组的第5个元素,它也是个指针,指向字符串"cd",所以strlen(p[4])=2
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询