c - 不同类型的指针赋值
问题描述
我们可以在 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 中没有“字符串”这样的类型。字符串不是原始类型。字符串只是一个字符数组,以 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_arr
和string
都是char *
,因为正如我们刚才所说的,数组的名称等于指向其第一个元素的指针。当然,所有这些都是透明地完成的,您实际上不会看到另一个名为 的变量hidden_arr
,这只是一个示例。实际上,该字符串将存储在可执行文件中的某个位置而没有名称,并且该位置的地址将被复制到您的string
指针。
当你尝试对整数做同样的事情时,这是错误的,因为int *
和int
是不同的类型,你不能这样写(好吧,你可以,但它没有意义,并且不会像你期望的那样做):
int *ptr;
ptr = 123;
但是,你可以用一个整数数组很好地做到这一点:
int arr[] = {1, 2, 3};
int *ptr;
ptr = arr;
// Same as:
ptr = &(arr[0]);
推荐阅读
- php - 取消设置一些 WooCommerce 结帐帐单字段和 One Page Checkout 插件
- javascript - 为什么通过道具传递到子组件中的函数在按键和按钮单击时表现不同?
- android - 构建:失败_给定的工件包含一个字符串文字,其中包含无法安全重写的包引用“android.support.design.widget”
- php - MSSQL 的 PHP 类似物
- c++ - 每次创建 C++ 文件时,VsCode 都会创建一个 .exe 文件
- javascript - How to add Service worker file in the root directory to the client application
- python - "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-wF_NKE/decorator/
- pandas - 如何在多个位置将文件中的列插入到另一个文件中
- reactjs - Webpack build Module parse failed: Unexpected token (17:2)
- bash - "Git Bash here" takes too long to start (also MSYS2 bash terminal)