首先讲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语言数组名,就是数组的首地址.数组的首地址,就是首元素地址.
所以
C语言数组地址指向首元素是正确的.
即
int
a[N]
a的值
就是&a[0]
数组名就是数组的首地址啊。
直接使用swaps(a,b)就可以
不过其实你子函数就写错了,根本就不是你所说的用数组地址做形参。而是要求用一个 二维数组或者是指针数组作为实参。
正确的代码如下
#include<string.h>
#include<stdio.h>
char d[100]
void swaps(char *p,char *q)
{
if(strcmp(p,q)>0)
{
strcpy(d,p)
strcpy(p,q)
strcpy(q,d)
}
}
int main()
{
char a[]="",b[]="",c[]=""
printf("请输入三个字符串,每输入一个字符串按回车确认\n")
gets(a)
gets(b)
gets(c)
swaps(a,b)
return 0
}
void swaps(char *p,char *q)就是要求传一个地址(指针),而如果你使用
void swaps(char *p[],char *q[])则意义就不对了,而是要求一个指针数组