【牛客 题库】指针与常量字符串

来源:互联网 发布:淘宝小号批量注册机 编辑:程序博客网 时间:2024/06/05 10:20
1.在 C 语言中下面那个语句的结果是 1 ?
  • main 函数正常结束的返回值
  • return 7&1;
  • char *p="hello"; return p == "hello";
  • 上面都不对

解答:BC
hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。
p=="hello"不是把*p里的值和"hello"相比较,而是把p的值和"hello"的地址相比较,而p的值就是"hello"的地址,所以相等啊。== 比较的不是字符串的内容,而是字符串的地址。比较字符串的内容要用strcmp()。
下面是一篇博客的讲解:c语言中输出字符指针相关问题
定义一个 char * p = "hello";的字符指针。
c语言中没有字符串的类型,所以对字符串操作,有两种形式:可以用字符指针(为什么不叫字符串指针,
我个人觉得,字符指针针对的是单个字符的操作,即指针操作,所以就叫它字符指针吧。。。),
或者字符串数组(这里不在讨论字符串相关问题,前面博客有讨论过)这里的指针变量p,系统会为其重新分配内存。

有人会问,p不是指针变量吗?但是为什么printf("%s",p)他为什么打印的不是地址?

答:是的p肯定是指针变量,它也一定是地址,但是别忘了在C语言中,系统都会默认在字符串末给我们加上\0用于

结束字符串,所以用printf()输出时候,只要你打印格式是%s,系统知道我们要输出字符串,而且系统也可以确定

字符串的长度,所以当你用%s打印字符指针p的时候就会输出字符串,如果你是以地址打印格式输出的话,系统就会

给我们打印出地址, 如果你是解指针(*p),那么系统就取p指针指向的内容,此时看你自己以什么格式输出,就用

什么格式打印。

注意:在字符指针中p 、*p 和&p的区别:p是指针变量指向字符串首元素(前提对p指针没有进行指针操作),

p中存放首元素的地址(一旦被初始化就,系统就为我们分配好了地址,而且地址也不能改变,因为字符指针是一个

只读变量,你不能企图对一个初始化好的指针进行内部修改),而*p是对指针变量p进行解引用操作,也就是指针所

指向的内容,而&p是对指针变量取地址,所以也就肯定不会和p的值相等,因为字符指针系统会为其分配内存,p的

值是字符串首元素的地址。