首页 > 解决方案 > 不同类型的指针赋值

问题描述

我们可以在 C 中分配一个字符串,如下所示:

char *string;
string = "Hello";
printf("%s\n", string); // string
printf("%p\n", string); // memory-address

并且可以按如下方式完成一个数字:

int num = 4404;
int *nump = #
printf("%d\n", *nump);
printf("%p\n", nump);

那么我的问题是,为什么我们不能像处理字符串一样在 C 中分配一个指向数字的指针?例如,做:

int *num;
num = 4404;
// and the rest...

是什么让字符串与其他原始类型有根本的不同?我对 C 很陌生,所以任何关于两者之间差异的解释都会非常有帮助。

标签: c

解决方案


C 中没有“字符串”这样的类型。字符串不是原始类型。字符串只是一个字符数组,以 NUL 字节 ( '\0') 结尾。

当你这样做时:

char *string;
string = "Hello";

真正发生的是编译器很聪明,会创建一个常量只读char数组,然后将其分配给您的变量string。可以这样做,因为在 C 中,数组的名称与指向其第一个元素的指针相同。

// This is placed in a different section:
const char hidden_arr[] = {'H', 'e', 'l', 'l', 'o', '\0'};

char *string;
string = hidden_arr;
// Same as:
string = &(hidden_arr[0]);

这里hidden_arrstring都是char *,因为正如我们刚才所说的,数组的名称等于指向其第一个元素的指针。当然,所有这些都是透明地完成的,您实际上不会看到另一个名为 的变量hidden_arr,这只是一个示例。实际上,该字符串将存储在可执行文件中的某个位置而没有名称,并且该位置的地址将被复制到您的string指针。

当你尝试对整数做同样的事情时,这是错误的,因为int *int是不同的类型,你不能这样写(好吧,你可以,但它没有意义,并且不会像你期望的那样做):

int *ptr;
ptr = 123;

但是,你可以用一个整数数组很好地做到这一点:

int arr[] = {1, 2, 3};
int *ptr;
ptr = arr;
// Same as:
ptr = &(arr[0]);

推荐阅读