c语言取数组地址吗
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[])则意义就不对了,而是要求一个指针数组
B. C语言中怎么输出数组的首地址
%p
直接用16进制地址形式输出地址
%d
把地址直接用10进制形式输出
char
a[]
=
"hellow
C++";
int
b[]
=
{0x01,0x02,4,0x08,0};
如上数组如下输出都可以:
printf("十进制地址%d
十六进制地址%p",
a,
a);
printf("十进制地址%d
十六进制地址%p",
b,
b);
printf("十进制地址%d
十六进制地址%p",
&a[0],
&a[0]);
printf("十进制地址%d
十六进制地址%p",
&b[0],
&b[0]);
C. C语言关于字符串数组取地址的问题。到底要不要&呢
格式"%s"输入字符串到字符数组不需要加取址符&
D. 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维数组得到进一步理解,讲的有点乱,不知道你能不能理解
E. c语言中,对一维数组名取地址
准确的说法,是变成了二级指针。
而二级指针,是指向指针地址的指针,变相相当于一个第一维度只有1的二维数组。
其中的根源,在于C语言中,声明一个数组其实相当于申请了一个定长的指针(存储位置不同,使用上还是有区别的),你可以将数组名当做指针使用,而反过来,也可以将一个指针,以数组的方式合法访问其成员。而二维数组的声明后,A[1][3],之后A[0]是一个一维数组,同样A[0]保存的,也是这个一维数组的地址,A保存的是A[0]的地址,和二级指针相同。
F. C语言:数组的值是地址
不对。
数组名是数组的首地址,就是数组中第一个元素的地址,是常量。常量是不能出现在赋值号=左边作为左值的。楼上的都没有解释清楚,说数组名就是指针是错误的,指针是变量,是用来存储变量地址值的变量,而数组名是常量。一般情况下声明一个数组,比如char a[10];之后,数组名a都是数组的首地址,是一个地址常量。但是在函数声明的形参列表中除外。比如:int foo(char a[10]);在这种情况下这样的声明与int foo(char a[]);int foo(char * a);是等价的,就是说这种情况下,就算你写的是数组的形式,编译器实际处理的时候也当指针来处理(注意指针是变量,形参也是变量,二者刚好对应)。所以在函数foo内部,你对a进行++, --, +=,=之类的带赋值的操作是完全合法的,因为此时a就是一个指针,不是数组名,当你往函数foo里面传入一个已经事先声明的数组的首地址时候,指针a里面的值就是你这个已经声明的数组的首地址,这样你在foo里面就可以对你那个数组进行操作,正是因为C有这个传地址的优点,所以省略了很多不必要的拷贝工作,试想如果没有这个传地址,你传一个有几万个元素的数组进去,那拷贝工作是相当可观的。这样,你该明白了int main(int argc, char ** argv);里面为什么可以对argv进行++操作了,既然“main函数的第二个形参是一个指向字符串的指针数组”,argv出现在函数声明中,所以它实际上是一个指针,它并不是“一个指向字符串的指针数组”,而是一个可以获取“一个指向字符串的指针数组”的首地址值的变量。
G. C语言如何获得数组首地址的指针
单维数组名就是首地址,多维数组名就是第1维的首地址,因此取首地址,可以把数组名赋给对应的指针变量,或取索引为0的首个元素地址赋给对应的指针变量。举例:
单维 int arr[10]; int * p =arr; 或 int * p =&arr[0];
二维 int arr[10][10]; int (*p)[10] =arr; 或int (*p)[10] = &arr[0];// 取第一维地址
int arr[10][10]; int * p= & arr[0][0]; // 取多维中的首个元素
H. 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;
}
I. c语言中数组名和对数组名取地址一样吗
值是一样的 但是类型不一样
值都是数组的起始地址
但类型不同,如int a[10];
a的类型 是int *型。
而&a类型 是int **型。
这在赋值 自加等操作中 就会产生不同结果。