欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组a[]的数组名a和对数组名取地址&a的区别

程序员文章站 2022-04-11 18:54:37
...

二者区别

如:对于数组int a[10];
a: 数组名a是指数组首元素的地址(以数组中的一个元素大小为单位)
&a: 数组名取地址&a是指整个数组的首地址(以整个数组大小为单位)

#include <iostream>
using namespace std;
int main() {
	int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
	printf("%p\n", a);
	printf("%p\n", &a);
	printf("%p\n", a + 1);
	printf("%p\n", &a + 1);
}

数组a[]的数组名a和对数组名取地址&a的区别
可以看出:
a和&a是指的同一个地址,但是对他们的相同操作结果却不一样
a + 1加的是一个单位元素的大小,即加了4个字节(整型)
&a + 1加的是整个数组的大小,即加了40(4*10)个字节,即指向本数组结束后的下一个地址
注意:&a的类型既不是二级指针,也不是一级指针!

直接上题目

废话不多说,直接上两道笔试题!

题目一

#include <iostream>
using namespace std;
int main() {
	int a[4]={1,2,3,4};
	int *ptr=(int*)(&a+1); //一定注意强制类型转换!!!!不然编译出错!!因为&a是个特殊的类型!
	printf("%d",*(ptr-1));
}

数组a[]的数组名a和对数组名取地址&a的区别
题目二

#include<iostream>
#include<vector>
using namespace std;

int main() {
	char a[] = "hello,DAHUA";
	char* ptr = (char*)(&a + 1);
	printf("%c\n", *(ptr - 2));
}


数组a[]的数组名a和对数组名取地址&a的区别
第二道这里注意小陷阱:字符串最后一个是个空字符’\0’,所以结果是A而不是U