神之间 发表于 2016-4-21 22:23:00

新手关于指针的小问题

#include<stdio.h>
void main()
{
        char a={"hello","world","asdf"};
        char (*p);
        p=&a;
        printf("%s",p);
        printf("%s",*p);
}
为何输出的是一样的?

mingcxx 发表于 2016-4-21 23:22:05

本帖最后由 mingcxx 于 2016-4-22 00:15 编辑

语句“ char a={"hello","world","asdf"};”表示a是具有3个元素的数组,每个元素又是有20个char字符的数组。
语句“char (*p);”表示p是指向一个数组的指针,这个数组有3个char元素。简单说,p是指向3个char的指针。p的类型是“char (*)”
语句" p=&a;"有误,用户本意是让p指向a,而a是a的首元素,该首元素是具有20个char的数组。
即等号两边的类型不同一:指向3个char的p(等号左边)指向了20个 char, 应该有编译警告,不报错。但是原理上是错误的。
printf()打印字符串时只需要一个字符串的地址(准确说是一个字符指针),它依次打印该地址到第一个空字符之间的所有字符。
语句"printf("%s",p);"打印字符串,p指示了a的第一个字符数组的地址(存放了“hello”)
语句" printf("%s",*p);"打印字符串,*p指示了第一个字符数组的首元素的地址(“hello”的'h'的地址)
所以打印效果完全一样。
找到这个——http://bbs.fishc.com/thread-17978-1-1.html

倾天 发表于 2016-4-22 09:20:05

很简单,
printf("%p\n", p);

printf("%p\n", *p);


结果一样,就代表p == *p,
所以输出会一样

mingcxx 发表于 2016-4-22 12:54:36

p是指向3个char的指针:char (*)
*p是指向1个char的指针:char *
数值相等,意义不同。

神之间 发表于 2016-4-22 16:03:30

mingcxx 发表于 2016-4-21 23:22
语句“ char a={"hello","world","asdf"};”表示a是具有3个元素的数组,每个元素又是有20个char字符 ...

谢谢

xls6688 发表于 2016-4-22 17:06:06

看看{:5_92:}

mingcxx 发表于 2016-4-22 17:20:20

神之间 发表于 2016-4-22 16:03
谢谢

千言万语汇成一个表情{:10_279:}

王路凡 发表于 2016-4-24 21:02:54

水币

470054086 发表于 2016-4-25 10:19:23

拿币走人
页: [1]
查看完整版本: 新手关于指针的小问题