定义char和int时指针有什么区别?

J. *_*Doe 11 c++ pointers

我理解指针如何工作的基础知识,但以下示例让我感到困惑.

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秘密.

  • `"......"`不是`char*`.我不推荐学习C++的C书; 习语完全不同. (4认同)