指针的大小是固定的四个或八个字节
我们来写代码来说明一下
void test(int arr[])
{
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", sz);
}
int main()
{
int arr[10] = { 0 };
test(arr);
return 0;
}
我们来分析函数:创建整型的数组arr,arr的元素个数为10,arr的元素内部为0,调用test函数,把数组首元素arr传递过去,我们看函数部分,函数的目的是打印数字,所以不需要返回值,用void ,我们把参数arr传递进去,然后我们在函数内部创建数组arr来接收传递过来的地址,我们在函数内部创建sz sizeof(arr)是数组指针所占的 字节数,sizeof(arr[0])表示数组首元素所占的字节数(也是数组一个元素所占的字节数),我们在32位平台上打印的结果位
在64位平台的结果如图所示
为什么结果会不同呢?
因为在32位平台上,一个指针所占的字节数为4,在64位平台上,一个指针所占的字节数为8,数组首元素所占的字节数为4,所以4/4=1 8/4=2
常量字符串
上代码
int main()
{
char*p = "abcdef";
return 0;
}
在正常的情况下,“abcdef”所占的字节数为7,是无法放在内存为四个字节的指针p中去的
但我们的代码却执行成功,为什么呢?
这里的“abcdef”是常量字符串,这里的意思是把a的地址传给p指针,我们可以验证一下
我们对p进行解引用并打印,发现结果的确是1.
那是否可以用这个指针直接打印这个数组呢?
答案是肯定的
我们对于这种常量字符串的方法有一个禁忌
不能使用解引用操作改变p的值
这样是不行的,我们通过常量字符串直接把首元素的地址传给指针,因为字符串为常量,所以不能通过解引用的方法改变数组首元素
我们有什么方法改进?在char前面加入const,const在这里的作用是固定*p,使p不能通过解引用的方法改变,从而起到保护作用。
我们编写一段代码,提升我们对指针的理解
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
char*p1 = "abcdef";
char*p2 = "abcdef";
if (arr1 == arr2)
{
prrintf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
代码非常简单,打印结果是什么呢?
打印结果为haha,证明arr1不等于arr2,为什么呢?
因为我们创建了两个数组,两个数组的地址也不相同,所以两个地址的首元素也不想等,所以arr1不等于arr2
我们再对代码进行改进
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
char*p1 = "abcdef";
char*p2 = "abcdef";
if (p1==p2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
运行程序
我们可以看到打印结果为hehe,证明p1等于‘p2,这两个为什么相同呢?
因为这两个指针对应的字符串都是常量字符串,因为这两个常量字符串的值相等,他们又无法被改变,所以我们在使用它们的时候只用创建一个地址就可以了,目的是为了减少内存的浪费
接下来,我们来了解一下指针数组
指针数组:顾名思义,存放指针的数组就是指针数组
我们写一个指针数组
int main()
{
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int*arr[4] = { &a, &b, &c, &d };
return 0;
}
我们进行调试
我们可以发现,abcd的地址基本上在同一个位置
指针数组arr内部也有四个指针
如何使用数组指针
int main()
{
int arr1[] = { 1, 2, 3, 4, 5 };
int arr2[] = { 2, 3, 4, 5, 6 };
int arr3[] = { 3, 4, 5, 6, 7 };
return 0;
}
我们如何通过数组指针来打印这三个数组里面的全部元素
int main()
{
int arr1[] = { 1, 2, 3, 4, 5 };
int arr2[] = { 2, 3, 4, 5, 6 };
int arr3[] = { 3, 4, 5, 6, 7 };
int*parr[] = { arr1, arr2, arr3 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", *(parr[i]+j));
}
printf("\n");
}
return 0;
}
代码结果如图所示,如何分析这个代码:首先我们创建三个数组,接下来我们创建数组指针parr,数组指针内存存放的是三个数组首元素的地址,我们调用两个for循环,我们通过解引用的方法,parr[i]表示数组指针的第几个元素,+j表示数组指针第i个元素(数组)内部的第几个元素,将他们全部打印出来即为数组指针的全部元素。