请帮我理解下面的程序.
#include<stdio.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
&a[1]和&a+1.它们是相同还是不同?
#include <stdio.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
我想知道*a[5]在记忆中是如何表现的.是*a指向的基指针a[0],a[1],a[2],a[3],a[4]吗?
#include<stdio.h>
int main()
{
int v[10];
int **p;
int (*a)[10];
a=&v;
printf("%d\n",*a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
a=v; // gives error why?确实v在这里腐烂成*v.那&v会腐烂(*)[]v吗?&表示const指针.在这里,如何在没有类型转换的情况下将const指针设置为非const指针?
数组在哪里存储在内存中.它是否存储在内存的数据段中.
#include<stdio.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经阅读了一些文章,其中说明了数组名称不能被指定为指针的唯一两种可能情况是sizeof和&.但是在上面的程序中sizeof(&carray),大小为4.并且&carray衰减为(*)[]carrayrvalue.
然后声明数组名称不能在两个条件下衰减为指针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(在上一个例子中)是一个指向数组的指针.您想要分配a,然后您需要分配数组的地址v(或任何其他具有正确尺寸的数组);
a = &v;
Run Code Online (Sandbox Code Playgroud)
这是非常好的,你已经致力于理解事物,但没有什么比一本好的C书更能帮助你.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
3329 次 |
| 最近记录: |