一.导入
我们先来看一段代码:
#include
int main(void){
int arr[10];
printf("%pn",arr);
printf("%pn",&arr[0]);
getchar();
return 0;
}
我们创建了一个数组arr,第一个printf()语句来打印arr这个数组名,第二个printf()语句来打印数组arr首元素的地址,程序运行结果如下:
我们可以发现两个printf()语句输出的结果是一样的,那么我们就可以得出结论:数组名就是首元素的地址
我们再来看一段代码:
#include
int main(void){
int arr[10];
printf("%pn",arr);
printf("%pn",&arr[0]);
int n = sizeof(arr);
printf("n=%dn",n);
getchar();
return 0;
}
既然数组名arr输出的结果是首元素的地址,那么使用sizeof()函数来计算数组arr的大小结果应该是4或者8(取决于编译平台)但是当我们运行程序以后可以发现n的值为40,如图所示:#include
这就与上面的结论产生了冲突,也就是说上面的结论不完全准确,接下来我们就着重来进行一个区分
首先数组名就是数组首元素的地址这句话没错,但是有两个例外:
1.使用sizeof()函数的时候(sizeof(数组名))这时候数组名代表整个数组,计算的是整个数组的大小(单位:字节)
2.&数组名(&读作取地址)这里的数组名代表整个数组,这时候取出的是整个数组的地址
为了让我们更好的理解,我们还是用代码来作为演示,代码如下:
int main(void){
int arr[10];
printf("%pn",arr);
printf("%pn",&arr[0]);
printf("%pn",&arr);
getchar();
return 0;
}
前面两个printf()语句对应输出的内容上文已经讲了,着重来看第三个printf()语句,这里的printf()语句将数服务器托管网组服务器托管网arr的地址打印了出来,我们来看程序运行的结果:
我们可以发现三个值是一模一样的,但是结果相同不代表他们的性质相同,我们来看下图:
其中蓝色箭头和绿色箭头代表的都是数组首元素的地址,所以两者值相同也无可厚非,黑色箭头则代表数组的开始,取出的是整个数组的地址,为了方便我们观察,我们进行一个对比试验,将代码修改成如下形式:
#include
int main(void){
int arr[10];
printf("%pn",arr);
printf("%pn",arr+1);
printf("------------------n");
printf("%pn",&arr[0]);
printf("%pn", &arr[0]+1);
printf("------------------n");
printf("%pn",&arr);
printf("%pn", &arr+1);
getchar();
return 0;
}
我们再次编译以上代码就可以发现他们之间的差别了,程序运行结果如下:
我们先来看第一段的代码,这里的输出的arr就是首元素的地址,因为其不满足上面讲到的两种特殊情况,第二段代码则一定是输出的arr数组中的首元素地址,所以与第一段代码运行的结果是一样的,当我们对其进行+1后相当于跳过一个元素的地址,由于是整型数组,一个元素占用的大小为4字节,所以+1后的地址比原先的地址大4,如图所示:
但是我们第三段代码+1后则比原先多出了28,注意此时的0x28为16进制(2*16^1+8*16^0),我们换算过来就是差了40,所以这就代表着我们将数组整体往后面移了,如图所示:
2023/9/1
王起舟
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
文章目录 概述 1.搭建apache 2.安装cpolar内网穿透 3.公网访问配置 4.固定公网地址 5.添加站点 概述 Termux是一个Android终端仿真应用程序,用于在 Android 手机上搭建一个完整的Linux 环境,能够实现Linux下的许…