c语言数组是地址
‘壹’ c语言中数组变量是地址还是
adjective代表数组的首地址。这本身就是个地址。所以你那句scanf不对。另外,字符数组本身不会自动添加字符串结束符'\0'.这个要特别注意。
‘贰’ C语言 数组首地址
a为数组名,代表数组首地址
&a 中的&为取地址运算符
结果都是一样
‘叁’ 关于C语言数组的地址
数组名就是数组的首地址啊。
直接使用swaps(a,b)就可以
不过其实你子函数就写错了,根本就不是你所说的用数组地址做形参。而是要求用一个 二维数组或者是指针数组作为实参。
正确的代码如下
#include<string.h>
#include<stdio.h>
chard[100];
voidswaps(char*p,char*q)
{
if(strcmp(p,q)>0)
{
strcpy(d,p);
strcpy(p,q);
strcpy(q,d);
}
}
intmain()
{
chara[]="",b[]="",c[]="";
printf("请输入三个字符串,每输入一个字符串按回车确认 ");
gets(a);
gets(b);
gets(c);
swaps(a,b);
return0;
}
voidswaps(char*p,char*q)就是要求传一个地址(指针),而如果你使用
voidswaps(char*p[],char*q[])则意义就不对了,而是要求一个指针数组
‘肆’ C语言如何知道数组的首地址是多少
void e2prom_reads(1,&ptr,4); //这样调用对吗?
不对 应该是 void e2prom_reads(1,&ptr[0],4);
或者 void e2prom_reads(1,ptr,4);
‘伍’ C语言 数组地址问题
此处的t就是整个二维数组的地址,A选项中t[3][2]不属于该数组,因为数组下标是从0开始的,这是个3行2列的数组,所以行坐标最大为2,列坐标最大为1;因此B选项中t[3]也不表示任何地址;C选项,t是整个二维数组的地址,所以t+1就是数组第二行的地址,而t[1]代表第二行第列元素的地址;t+2就是第三行的首地址。二维数组名代表数组首地址,t+1代表第二行,t+2代表第三行首地址
‘陆’ C语言数组地址引用正确的是
int c[4][5],(*cp)[5];
cp=c;
这里cp是二维数组c的首地址 cp本身也是二维数组
正确的是:C
*(*cp+2) *cp是cp[0][0]的地址 *cp+2就是cp[2][0]的地址
*(*cp+2) 就是cp[2][0]的值
其余的引用都是引用的地址
要想引用二维数组的元素值 必须使用两个**
希望能帮助你哈
‘柒’ C语言数组的地址
其实你这个疑问是概念上的混淆,或者说对指针了解上上的欠缺
首先讲int a[3] = {2,3,4};
这里的a是这个数组的首地址,比如定义如:int *p = a;这时如果你进行如下操作:
p++;
printf("%d\n",*p);
结果会是输出2,也就是说p+1相当于数组索引加1,但是像你所问的为什么&a和a是相同的 ,首先要知道他们分别代表什么意思,a:像上面所说的是数组的首地址,做自加运算会根据数组类型来计算偏移量,那么&a是什么东西呢,实际上它也是一个指针,是指向一个具有3个元素的数组的指针,如何理解,看以下定义:
如果你定义int *q = &a;这时编译器肯定报错,绘制出数据类型不一致,那么你这样样定义就没有问题:int (*q)[3] = &a;这时如果你再对q进行++操作,那么加的就不同了,如相面的p++操作后p的值会加4,而这里q++操作后的值会加12,也就是跳过3个数组元素,然而,确实这两个指针的初始值是一样的,只是类型不一样而已,这对二维数组的访问时很方便的,这个你可以参照2维数组得到进一步理解,讲的有点乱,不知道你能不能理解
‘捌’ C语言数组地址问题
int占用的是4字节,是你输出的时候代码没写对
(DWORD)&a[4]-(DWORD)&a[0]
这个差值才是你要的,我这边显示的是16
‘玖’ C语言数组地址问题
解释如下:
&a,*a,a,a[0]——都表示的是数组第0行第0个元素的地址;
*a[0]——这个特殊,表示第0行第0个元素的地址的地址;
a[2],&a[2]——都表示第2行第0个元素的地址;
&a[2][2]——表示第2行第2个元素的地址;
详见图片,我已经把数组中主要元素的地址和值都打印出来了,数组中对应的每个元素的地址写出来了,对照的找下对应元素的位置,应该能理解&a,*a,a,a[0],*a[0],a[2],&a[2],&a[2][2]是什么意思了
#include<stdio.h>
#include<stdlib.h>
intmain()
{
inta[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};
printf("&a十六进制地址是%p,十进制是%d
",&a,&a);//数组名,a[3][4]
printf("*a十六进制地址是%p,十进制是%d
",*a,*a);
printf("a十六进制地址是%p,十进制是%d
",a,a);
printf("a[0]十六进制地址是%p,十进制是%d
",a[0],a[0]);
printf("*a[0]十六进制地址是%p,十进制是%d
",*a[0],*a[0]);
printf("a[2]十六进制地址是%p,十进制是%d
",a[2],a[2]);
printf("&a[2]十六进制地址是%p,十进制是%d
",&a[2],&a[2]);
printf("&a[2][2]十六进制地址是%p,十进制是%d
",&a[2][2],&a[2][2]);
printf("数组a[3][4]首元素a[0][0]的地址是%p,首元素a[0][0]的值=:%d
",&a[0][0],a[0][0]);
printf("数组a[3][4]首元素a[2][0]的地址是%p,首元素a[2][0]的值=:%d
",&a[2][0],a[2][0]);
printf("数组a[3][4]首元素a[2][2]的地址是%p,首元素a[2][2]的值=:%d
",&a[2][2],a[2][2]);
printf("一个int整型变量占的字节是:%d",sizeof(int));
return0;
}
‘拾’ C语言中数组首地址和数组第一个元素的地址有什么区别呢
C语言中数组首地址和数组第一个元素的地址关系如下:
1、它们的地址值是相等的。
2、第1个元素的地址如果是p,则p+1就是第2个元素的地址。
3、数组的首地址如果是p,则p+1就跳过这个数数组而指向这个数组最后一个元素最后一个字节的下一字节。
(10)c语言数组是地址扩展阅读:
数组的创建:在创建数组时,我们必须定义数组的类型和大小,数组的大小不能为0,数组中的元素类型都是相同的。
数组的初始化:在数组创建时,我们也要必须为数组初始化。
一个数组,可以保存一些数据,但是每一个数据不一定有用。或者说,有些时候的数组的数据不一定要输出,所以我们可以再来开一个相同的数组,来标记模拟是否输出数组中的某个元素。