我理解指针如何工作的基础知识,但以下示例让我感到困惑.
int *myNum = 10; // Produces an error
char *myChar = "Something"; // Works fine
Run Code Online (Sandbox Code Playgroud)
为什么分配char工作但整数不工作(可能导致char被视为数组)?
在直接分配指针变量时,是什么让我感到困惑,它会自动获取地址吗?
char *myChar = "Something";
Run Code Online (Sandbox Code Playgroud)
和
char myChar = "Something";
char *charAddr = &myChar;
Run Code Online (Sandbox Code Playgroud)
这里有什么不同,或等于?
use*_*751 20
"Something"
Run Code Online (Sandbox Code Playgroud)
基本上是:
static const char some_hidden_array[] = {'S', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', '\0'};
some_hidden_array
Run Code Online (Sandbox Code Playgroud)
也就是说,在编写时"Something",编译器会在后台生成一个数组,并为您提供指向该数组开头的指针.由于这已经是一个指向char的指针,因此将它分配给"指向char的指针"(写为char*)的变量是没有问题的.
10
Run Code Online (Sandbox Code Playgroud)
对于类似的东西来说并不缺乏.它只是数字10 - 它不是指向包含数字10的数组的指针,或类似的东西.
请注意,a char是单个字符,而不是字符串,这就是为什么字符串语法与大多数其他类型相比是不寻常的 - 字符串是几个字符,而不仅仅是一个字符.如果你尝试使用普通的旧产品char,你会看到同样的事情:
char *myChar = 'a'; // error
Run Code Online (Sandbox Code Playgroud)
或任何其他类型:
float *myFloat = 42.1f; // error
Run Code Online (Sandbox Code Playgroud)
换句话说,这不是奇怪的是,10给出了一个错误-如果有的话,这是奇怪的是,"Something" 没有.(至少,在知道字符串文字是如何工作之前,这很奇怪)
Lau*_*ent 10
这是一回事(编译器没有任何魔法发生).默认情况下,像10这样的文字是int值,而不是int*.
你需要施放:
int *myNum = (int*)10; // Need to cast
char *myChar = "Something"; // No need to cast "..." is already a char*
Run Code Online (Sandbox Code Playgroud)
请注意,引用指向绝对值的指针是很危险的,因为最终会在CPU内存中找到地址10.
关于你的第二个问题,"..."在内存中被视为一个连续的char序列,类似于数组,相当于char*.
为了深入理解C,数组和指针之间的指针和差异,你应该阅读:专家C编程:Peter van der Linden的深层C秘密.