在下面的两个陈述中考虑这两个之间的区别是什么?
null
char s[] = "geeksquiz"; char *s = "geeksquiz";
以下是主要区别:
声明 char s[]=“Geeksquick” ‘创建一个与任何其他数组类似的字符数组,我们可以执行所有数组操作。这个数组唯一的特殊之处是,虽然我们用9个元素初始化了它,但它的大小是10(编译器会自动添加“”)
C
#include <stdio.h> int main() { char s[] = "geeksquiz" ; printf ( "%lu" , sizeof (s)); s[0] = 'j' ; printf ( "%s" , s); return 0; } |
输出:
10jeeksquiz
声明 char*s=“Geeksquick” ‘创建字符串文字。大多数编译器将字符串文本存储在内存的只读部分。C和C++标准表示字符串文字具有静态存储持续时间,任何修改它们的尝试都会给出未定义的行为。 s 只是一个指针,和其他任何指针一样,它存储字符串文本的地址。
C
#include <stdio.h> int main() { char *s = "geeksquiz" ; printf ( "%lu" , sizeof (s)); // Uncommenting below line would cause undefined behaviour // (Caused segmentation fault on gcc) // s[0] = 'j'; return 0; } |
输出:
8
运行上述程序可能会产生一个警告:“警告:从字符串常量到‘char*’的不推荐转换”。出现此警告是因为s不是常量指针,但存储只读位置的地址。通过指向const的指针可以避免该警告。
C
#include <stdio.h> int main() { const char *s = "geeksquiz" ; printf ( "%lu" , sizeof (s)); return 0; } |
本文由Abhay Rathi撰稿。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END