Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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_Pointers - Fatal编程技术网

C 给指针分配不同的基址

C 给指针分配不同的基址,c,pointers,C,Pointers,我指的是Yashwant Kanetkar写的一本名为《让我们c》的书。 我对这个例子有点困惑,他给指针分配了一个基址。 例如: int x[10] = {1,2,3,4,5,6,7,8,9,10,11}; int *p = x; // base address of x assigned to *p //************// int z[10] = {1,2,3,4,5,6,7,8,9,10,11}; int *q = &z[0]; // base address o

我指的是Yashwant Kanetkar写的一本名为《让我们c》的书。 我对这个例子有点困惑,他给指针分配了一个基址。 例如:

int x[10] = {1,2,3,4,5,6,7,8,9,10,11};  
int *p = x; // base address of x assigned to *p  
//************// 
int z[10] = {1,2,3,4,5,6,7,8,9,10,11};
int *q = &z[0]; // base address of z assigned to *q  

如果两者具有相同的功能,那么为什么使用不同的符号?这样做还有其他原因吗?

相同结果的两种不同符号说明,数组x实际上只是一个指针,而元素x[0]是一个实际值。这只是C语言中类似英语的多种表达方式中的一个例子。

当您在赋值中使用数组名称时,就像在第一种情况下一样,数组会衰减为指向第一个元素地址的指针

在第二种情况下,表达式z[0]按值为您提供数组的第一个元素,当您在表达式前面加上一个符号&时,您将获得呈现第一种情况相同结果的元素的地址

两者实际上是相同的。通过使用基本索引,可以遍历为数组分配的内存。在这种情况下,访问[10];不正确,因为数组被定义为最多容纳10个元素。 第二种表示法主要用于分配特定元素的地址,,&x[n]


只是同义词。但是在第二种情况下,你可以做int*q=&z[1],例如,接受一个免费的建议:如果你真的有兴趣学习C,就扔掉那本书&*z也是等价的。p=x+0不会打扰你吗?这是我在问题中已经提到过的。还有其他的区别吗?或者这只是用不同的语言表达的一种方式way@Co.Aden没有其他区别,我想说两种获取数组地址的不同方法。数组不是指针。阅读。@Keith Thompson,x包含指向数组的指针,不是int吗?@someuser x本身将衰减为指向数组的第一个元素索引0的指针,并且可以像指针一样使用,例如x+1指向数组的第二个元素,但x本身不是指针。例如,x=NULL;或者任何修改x本身的操作都不会起作用,因为x是数组而不是指针。我想说,你可以把它看作一个常量限定指针int*const,但从技术上讲,这也不是真的,因为sizeof x!=sizeof&x[0],尽管当你考虑它时它是合乎逻辑的:你怎么能期望10个项目的大小是指向一个项目的指针的大小呢?有关更多信息,请参阅Keith发布的链接,但基本上它归结为数组可以像指针一样使用,只要所谓的指针本身没有被修改。顺便说一句,这也适用于被视为数组的指针,特别是在使用malloc等人时。因为实际的数据类型仍然是指针,而不是数组。换句话说,数组不是指针,指针也不是数组。