Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向不同类型的指针赋值_C - Fatal编程技术网

C 指向不同类型的指针赋值

C 指向不同类型的指针赋值,c,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); 可以按如下方式进行编号: char *string; string = "H

我们可以按如下方式在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);
可以按如下方式进行编号:

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语言的新手,所以任何关于两者区别的解释都会非常有用。

字符串文字(例如“hello world”)的类型是一个
char[]
。其中赋值
char*string=“Hello”
意味着
string
现在指向数组的开头(例如数组中第一个内存地址的地址:
&char[0]

由于指针的类型不同,您无法将整数指定给指针,但一个是
int
指针,另一个是
int*
指针。您可以将其转换为正确的类型:

int *num;
num = (int *) 4404;
但这将被认为是相当危险的(除非你真的知道自己在做什么)。也就是说,你知道什么是内存地址吗?

在C中没有“string”这样的类型。string是而不是原语类型。字符串只是一个字符数组,以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\u arr
string
都是
char*
,因为正如我们刚才所说,数组的名称等于指向其第一个元素的指针。当然,所有这些都是透明的,您实际上不会看到另一个名为
hidden\u arr
的变量,这只是一个示例。实际上,字符串将存储在可执行文件中的某个位置,而不带名称,该位置的地址将复制到
string
指针

当您尝试对整数执行相同操作时,这是错误的,因为
int*
int
是不同的类型,并且您无法编写此代码(当然,您可以,但它没有意义,并且不能实现您期望的功能):

但是,使用整数数组可以很好地实现这一点:

int numbers[] = {1, 2, 3, 4, 5, 0};
int *nump = numbers;
printf("%d\n", nump[0]); // string
printf("%p\n", nump);    // memory-address
是什么使字符串与其他基本类型有根本区别

字符串似乎是C中的基本类型,因为编译器理解
“foo”
,并生成以null结尾的字符数组:
['f','o','o','\0']
。但C字符串仍然只是一个字符数组

那么,我的问题是,为什么我们不能像处理字符串一样,在C语言中为一个数字分配一个指针呢

您当然可以将指针指定给数字,只是数字不是指针,而数组的值是数组的地址。如果您有一个
int
数组,那么它的工作方式就像一个字符串。比较您的代码:

char *string;
string = "Hello";
printf("%s\n", string); // string
printf("%p\n", string); // memory-address
对于整数数组的类似代码:

int numbers[] = {1, 2, 3, 4, 5, 0};
int *nump = numbers;
printf("%d\n", nump[0]); // string
printf("%p\n", nump);    // memory-address
唯一的区别是编译器对字符数组有一些额外的语法,因为它们非常常见,
printf()
同样也有一个格式说明符,用于字符数组

为什么我们不能像处理字符串一样在C中为数字分配指针

如果4404是int的有效地址,则代码可以执行该操作

printf("%d\n", *num);
整数可以转换为任何指针类型。除非之前另有规定,否则 结果是定义了实现,可能未正确对齐,可能未指向 引用类型的实体,并且可能是陷阱表示。
C11dr§6.3.2.3 5

如果地址未正确对齐-->未定义行为(UB)。
如果地址是陷阱-->未定义行为(UB)

尝试取消引用指针是一个问题,除非它指向有效的
int

printf("%d\n", *num);

下面,
“Hello”
是一个字符串文本。它存在于某个地方。赋值采用字符串文本的地址,并将其赋值给
string

char *string;
string = "Hello";
关键是,已知分配的地址对
char*
有效

num=4404中无效(可能无效)


是什么使字符串与其他基本类型有根本区别

在C语言中,字符串是C库规范,而不是C语言规范。它的定义便于解释其中的各种功能

字符串是以第一个空字符§7.1.1结尾的连续字符序列

基元类型是C语言的一部分

这些语言还具有字符串文字,如
字符*字符串中的
“Hello”
;string=“你好”。它们与字符串有些相似,但有所不同



我建议搜索“ISO/IEC9899:2017”以找到当前C规范的草案副本。它将回答您上周提出的10个问题中的许多问题。

C中的字符串存储为字符数组。可能与where is
num=4404在使用随机地址的系统中?现在,对于一些具有固定LED地址的嵌入式电路板等,这是有意义的,但这些是“独立系统”,而不是“托管系统”。重复:。TL;DR语言根本不允许这样做,而是使用显式强制转换。OK解释可能重复,但细节有误。虽然字符串文字是数组,但C字符串不是数组。字符串literal
“Hello”
不是只读的,因为它是不应该被写入的-结果是UB-它可能工作,可能不工作,可能会杀死代码
hidden_arr
(字符串文字)不是
char*
,因为数组不是指针,指针也不是数组。带
int*ptr;ptr=123,代码可以通过