数组衰减成指针
请帮我理解下面的程序。
#include int main() { int a[7]; a[0] = 1976; a[1] = 1984; printf("memory location of a: %p", a); printf("value at memory location %p is %d", a, *a); printf("value at memory location %p is %d", &a[1], a[1]); return 0; }
&a[1]
和&a+1
。 它们是相同还是不同?
#include int main() { int v[10]; int **p; int *a[5]; v[0] = 1234; v[1] = 5678; a[0] = v; a[1] = v+1; printf("%d\t%d\t%d\t%d\n", *a[0],*a[1],a[0][0],**a); printf("%d\n", sizeof(v)); return 0; }
我想知道*a[5]
如何在内存中表示。 *a
一个指向a[0],a[1],a[2],a[3],a[4]
的基指针?
#include int main() { int v[10]; int **p; int (*a)[10]; a=&v; printf("%d\n",*a); return 0; }
a=v; // gives error why?
v
在这里腐烂成*v
。 然后&v
腐烂成(*)[]v
? &表示const指针。 在这里,如何在没有类型转换的情况下将const指针设置为非const指针?
数组在哪里存储在内存中。 它是否存储在内存的数据段中。
#include int main() { int carray[5]={1,2,3,4,5}; printf("%d\n",carray[0]); printf("%d\t%d\t%d\n",sizeof(carray),sizeof(&carray),sizeof(&carray[0])); return 0; }
编辑:
我已经阅读了一些文章,其中指出数组名称不能被指定为指针的唯一两种可能情况是sizeof
和&
。 但是在上面的程序中, sizeof(&carray)
给出的大小为4.并且&carray
衰减成(*)[]carray
作为它的右值。
然后声明数组名称不能在两个条件sizeof
和&
变为false的情况下衰减成指针。
&a[1]
和&a+1
。 它们是相同还是不同?
不同。 &a[1]
与(a+1)
。 通常, x[y]
根据定义等同于*(x+y)
。
我想知道
*a[5]
如何在内存中表示。*a
是指向a[0],a[1],a[2],a[3],a[4]
的基指针。
在第二个示例中, a
是一个指针数组。 *a[i]
是对象的值,其地址存储为数组中的第 i 个元素。 *a
在这种情况下与a[0]
相同,它是数组中的第一个元素(它是一个指针)。
a=v //why this gives error
因为(在上一个示例中)是指向数组的指针。 您想要分配给a
,那么您需要分配数组v
的地址(或任何其他具有正确尺寸的数组);
a = &v;
这是非常好的,你已经承诺理解的东西,但没有什么比一本好的C书更能帮助你。
希望这可以帮助。
在处理指针时你需要知道的是:
int *a and int a[]
是一个数组的声明,唯一的不同之处在于,在[]中你必须声明它的常量大小,* a给你灵活性,它可以指向一个数组大小为1到无穷大
int *a[] and int **a
是一个数组数组的声明,有时称为矩阵,唯一的差异在于* a []你必须声明有多少数组a []将包含指针,** a给你灵活性,它可以指向您希望将其分配给的任何数组数组。
概述:在向变量添加&时,在类型定义中添加*:
int a;
&a – >&(int)= int *
将*添加到变量时,从类型定义中删除*
int * a;
* a – > *(int *)= int
int *a; &a - the Address given to the pointer a by the system(pointer of pointer = **a) &a+1 - the Address to the beginning of the array + 1 byte &a[1] == &(a+1) - the Address to the beginning of the array + 1 size of int int **a; *a == a[0] - the Address of the first Array in the array of arrays a *a[0]==a[0][0] - the first int of first array int *a, b[5]; *a=*b - ERROR because a points at garbage to begin with a=b - a points at array b
问我还想知道什么,生病编辑这个答案。
&a [1]和&a + 1。 它们是相同还是不同?
不是它们不是,第一个引用数组中的第二个整数,称为a,第二个引用从sizeof(int)字节构建的整数,从内存位置开始,位于+ 1个字节。
我想知道* a [5]如何在内存中表示。* a *是指向[0],[1],a [2],a [3],a [4]的基指针。
a现在是指向在大小为5的堆栈上声明的数组中第一个元素的位置的指针。&a指向与&a [0]相同的东西; &a [1]指向&a + sizeof(int)。
A = V; //给出错误原因? 在这里v衰变成* v。
这会给您一个错误,因为a是指向数组的指针,而v是数组。 因此,您必须将v(&v)的地址分配给a。
在这里v衰变成* v
数组永远不会衰落到它的第一个元素。 决不。 v
可以衰减到&v[0]
(与&*v
相同)但从不到v[0]
(或*v
,它是相同的)