关于指针声明
回答
正确的类比是,下面的两个是都错误:
char * p = 'a'; // error
int * q = 123; // error
在这里,你正试图某种类型的值赋给一个变量,它是一个指针到的变量那种类型。
与此相反,以下是正确的:
int tmp_a[] = { 10, 20, 30 };
char tmp_b[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
int * p = tmp_a;
char * q = tmp_b;
的字符串文字"hello"
是字符的匿名,只读阵列的相同的内容,作为tmp_b
,因此它可以被解释为一个指向其第一个元素。由于字符数据为只读,正确的定义应该是这样的:
const char * r = "hello"; // r[0] - r[5] have the same value as q[0] - q[5]
C中的字符串被定义为char *
。否则,如果你想有一个单一的字符,你会使用char var = 'x';
。
int *ptr = 10;
是不“错误”,它在法律上设置你的指针指向的地址“10”,这是在大多数(如果不是全部)的情况下,你的应用程序的内存界。
简单地说10
不是int*
,而是它是int
。你不能指定一个int
指针,因为它们是不同的东西。
代码char *ptr = "Hey"
成功,因为字符串文本与char*
指针兼容。
但请注意,char *ptr = "Hey"
会使ptr
指向字符串文字。字符串文字通常存储在只读存储器中,所以任何修改它们的尝试都会失败。所以你最好写const char *ptr = "Hey"
。
在C,"Hey"
被定义为字符的一个匿名数组,所以内存被分配以存储字符值(其中四个,还有一个空终止符)。
此外,你只能指向内存中的东西。所以char *
可以指向匿名字符数组。
值10
只是一个值。它没有分配给它的内存。你不能得到不在内存中的东西的地址。所以int *
失败。
要获得第二工作,你需要分配一些内存:
int value = 10;
int *ptr = &value; // value is in memory so we can point to it
在第一种情况下,"Hey"
是一个字符串,它的类型是char *
。因此,以这种方式初始化ptr
即可。话虽如此,它真的应尽可能遵循字符串文字不能被写入:
char const * ptr = "Hey";
在另一方面,声明是这样的:
int * ptr = ...;
你定义指向一个整数的指针。由于10
是一个纯整数常量,它不是一个现有的int对象,所以不能指向它。
int intValue;
int * ptr = &intValue;
在这种情况下intValue
是一个对象,你可以指向:但是,你可以像写些东西。
请记住像"Hey"
这样的字符串文字很特别。它们存储在内存中的某个地方,并且是不变的。
指定一个指向"Hey"
的指针实际上会在常量中创建该字符串,并将该常量的地址赋值给ptr
。
但是,当你有一个int* ptr
,分配给10
将分配地址10
,而你的意思的价值10
整数的地址。
说得很简单。当编译器看到的
char *ptr = "Hey"
字符串“嘿”,编译器会保存字符嘿加内存中的一个零终止字节,然后它会用一个指针代替“嘿”字符串的第一个字符中串。
在
int *ptr = 10;
也不会在10转换为指针。它会将10看作一个整数,并且抱怨它不是ptr的类型 - 一个指向int的指针。
- 1. 指针声明
- 2. 声明与指针
- 3. C++:声明指针
- 4. 关于指针函数声明中的函数
- 5. 晦涩的指针声明
- 6. 什么是指针声明?
- 7. 声明const指针为int?
- 8. 声明函数指针
- 9. 疑函数指针声明
- 10. 声明函数指针
- 11. 用指针内部的指针声明联合指针
- 12. C++指针 - 冲突的声明和指针到指针
- 13. 关于指针
- 14. 关于XML声明
- 15. 指定指针仅限于声明中吗?
- 16. 关于C指针
- 17. 函数声明使用perl函数指针声明
- 18. 在类声明中声明一个类对象的指针
- 19. 声明const的指针或const指针作为形式参数
- 20. 读取C指针类型声明
- 21. C++中的函数指针声明
- 22. 将指针声明为类成员C++
- 23. 函数指针声明 - __P做什么?
- 24. 函数指针的前向声明typedef
- 25. 声明与...不兼容(指针)
- 26. 声明默认指针值的函数
- 27. 在Cython中声明文件指针
- 28. C++成员函数指针,声明
- 29. 在MIPS中声明一个指针
- 30. 指针:C++需要的所有声明
应该明确指出,字符串文字(在C中)是只读的,但是不是“const”。这可能是一件坏事,只存在于旧代码中,而C++则修复它。 –
@ChrisLutz:你说得对,''hello''的*类型*只是C中的'char [6]'而不是'const char [6]',但是任何修改元素的尝试都是UB - 所以最好立即声明它为const。不过,我会将其编辑为“应该”。 –
这个工具会自动生成C指针语法的解释(它对此有用):http://cdecl.org/ –