![]() |
1
25
“s”不是“char*”,而是“char[4]”。因此,“&s”不是“char**”,而是“指向4个字符数组的指针”。编译器可能会将“&S”视为编写了“&S[0]”,这大致相同,但却是一个“char*”。 当您写“char**p=&s;”时,您试图说“我希望p被设置为当前指向“asd”的对象的地址。但目前没有什么 点 “ASD”。只有一个数组 持有 “ASD”;
|
![]() |
2
14
是的,编译器要求void*。把它们扔到空的地方。
|
![]() |
3
4
如果将数组的名称作为参数传递给函数,则会将其视为传递了数组的地址。所以S和S是相同的参数。见K&R 5.3。&S[0]与&S相同,因为它获取数组第一个元素的地址,这与获取数组本身的地址相同。 对于所有其他指针,尽管所有指针本质上都是内存位置,但它们仍然是类型化的,并且编译器将警告将一种类型的指针分配给另一种类型。
囊性纤维变性 http://www.oberon2005.ru/paper/kr_c.pdf (K&R的电子书版本) |
![]() |
4
3
它不是指向角色的指针
此外,Linux手册页 says :
您可以将代码更改为:
结果: s的值为:0x403f00 S的地址是:0x7fff2df9d588 p值为:0x7fff2df9d588 P的地址是:0x7fff2df9d580 S[0]的地址是:0x403f00 S[1]的地址是:0x403F01 S[2]的地址是:0x403F02 |
![]() |
5
1
变更线: char s[]=“滑动门”; 到: char*s=“asd”; 事情会变得更清楚 |
![]() |
6
1
不能更改静态数组的值(即地址)。在技术术语中,数组的左值是其第一个元素的地址。因此
|
![]() |
7
1
通常,不必要地将指针强制转换到(void*)被认为是糟糕的样式。但是,这里需要在printf参数上强制转换为(void*),因为printf是可变的。原型没有告诉编译器在调用站点将指针转换为什么类型。 |
![]() |
8
0
您使用过:
这里实际上是指向字节“asd”。S的地址也会指向这个位置。 如果您使用:
S和S的值将不同,因为S实际上是指向字节“asd”的指针。 你用过:
这里S指向字节“asd”。p是指向字符指针的指针,已设置为字符地址。换句话说,P中的间接寻址太多。如果使用char*s=“asd”,则可以使用此额外的间接寻址。 |