把字符串赋给一个指针变量,即是把字符串的首地址赋给该指针变量。
char *p="hello";
那么当我们输出p时,是不是输出地址呢?不是。请看下面四种情况:
printf("%s\n",p);//输出结果是hello
printf("%s\n",*p);
//运行出错。“0x00401a8c”指令引用的“0x00000043”内存。该内存不能为“read”.
cout<<p<<endl;//结果是hello
cout<<*p<<endl;//结果是h
既然p保存的是地址,为什么cout<<p; 输出的不是地址呢?
----------------解决方案--------------------------------------------------------
我也不懂,哪为高人来指导一下
----------------解决方案--------------------------------------------------------
那么当我们输出p时,是不是输出地址呢?
======================================
这句话本身表达就有问题。输出是不是地址跟你的表达式有关。
-----> printf("%d", p); //输出了指针p的地址
-----> printf("%s", p); //输出了指针p所指向的内容
printf("%s\n",p);//输出结果是hello
printf("%s\n",*p);
//运行出错。“0x00401a8c”指令引用的“0x00000043”内存。该内存不能为“read”.
======================================
char *p = "hello"; //这样指针p指向了字符串的首地址,所以对p的解引用*p其实就是字符串的首个字符,
//所以应该是 -->printf("%c", *p); 才对;
----------------解决方案--------------------------------------------------------
有道理!
----------------解决方案--------------------------------------------------------
printf("%s\n",*p);
//运行出错。“0x00401a8c”指令引用的“0x00000043”内存。该内存不能为“read”.
cout<<*p<<endl自动匹配了格式,输出*p所指的值?而printf("%s\n",*p)编译器不会报错,而是运行程序时出现问题。这是为什么呢?能不能解吸下%s的含义啊。
----------------解决方案--------------------------------------------------------
准确的说 %p 才是输出指针的地址
而楼主的问题..请详细参考下 %s 的解释
printf("%s\n",*p); 这句是完全的理解错误!
----------------解决方案--------------------------------------------------------
其实cout和printf一样,可以看作是格式化输出的函数.对于字符串的输出,cout<<字符串指针<<endl;cout对后面的参数自动匹配格式,当检查到参数为指针时,会自动检查后面连续的内存地址的存储,如果遇到'\0',(即构成一个字符串,)则依次把指针指向的字符和后面的字符输出,直到遇到'\0'为止。
应用于分析楼主的话,
虽然p保存的是地址,但对于cout<<p; 检查到p为指向字符的指针,且后面连续的存储单元有'\0'出现,cout自动匹配了格式,变为printf("%s",p);了。
对于c++,我只知道一点点,上面仅仅是我的理解,很有可能是错的。
----------------解决方案--------------------------------------------------------
cout会自动匹配输出格式,因为这个类包含了许多重载函数。
----------------解决方案--------------------------------------------------------
不错啊
学到不少东西
----------------解决方案--------------------------------------------------------
把字符串赋给一个指针变量,即是把字符串的首地址赋给该指针变量。
char *p="hello";
这个问题本质就是指针访问字符串
只是把hello串的第一个字符的地址赋给了P,在输出项中给出了P,系统就输出了第一个字符,
然后依次加一,知道遇到\0为止
----------------解决方案--------------------------------------------------------