指针的深入了解4

1.指针数组

指针数组是数组还是指针呢?这就好比整型数组等等的,所以说指针数组是数组,只不过元素是指针。

 指针数组模拟⼆维数组:

#include 
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数组中
int* parr[3] = {arr1, arr2, arr3};
int i = 0;
int j = 0;
for(i=0; i<3; i++)
{
for(j=0; j<5; j++)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}

我们创建了3个数组,分别将它们的首地址存入paar[]指针数组中,我们通过parr[0]就能找到arr1的首元素地址在通过parr[0][0]找到其第一个元素。parr数组类型为int *[]

parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组中的元素。上述的代码模拟出二维数组的效果,实际上并非完全是二维数组,因为每一行并非是连续的。

2.字符指针变量

在指针中有一种char *的指针变量。

我们来看一串代码:

指针的深入了解4_第1张图片

在前面我们了解到数组名其实是首元素地址,那在这里arr也是保存i的地址吗?我们用char *pt来保存它的值,并用printf()将其打印出来。我们来看看结果:

指针的深入了解4_第2张图片

 我们看到打印出了字符数组,所以说明arr就是首元素的地址。

《剑指offer》中收录了一道和字符串相关的笔试题,我们⼀起来学习⼀下:

#include 
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char *str3 = "hello bit.";
const char *str4 = "hello bit.";
if(str1 ==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}

思考一下运行是什么结果呢?

结果为:

指针的深入了解4_第3张图片

那么为什么是这样的结果呢?

我们知道str1和str2都是保存的首元素的地址,大家可能会觉得都保存的是i的地址为啥会不相同呢?其实我们在创建str1和str2两个数组时都会像内存申请空间,它们虽然内容相同但是申请的内存位置却不同,所以str1的值不等于str2.

那么为啥str3和str4相同呢?

在这里str3和受str4都是指针指向的都是这个字符串的首元素,这个字符串是一个常量字符串不可修改,所以没有必要再申请一份地址。所以他们指向的是同一个地址,所以相等。

在这里如果大家不理解我们试着将它们的地址打印出来:

指针的深入了解4_第4张图片

这样大家就更好理解了吧。

3. 数组指针变量

何为数组指针变量,我们在上面学到指针数组,那它们的区别在哪里呢?

指针数组是一种数组,数组中存放的是地址(指针)。在我们之前学的整型指针变量、字符指针变量等,所以说数组指针变量是指针变量只不过指向的是数组。

下面代码哪个是数组指针变量?

指针的深入了解4_第5张图片

下面一个是数组指针变量,上面一个为指针数组。在这里上面的pt先和[5]结合再和*结合,所以是指针数组。下面的pt先和*结合再和[5]结合所以是数组指针。在这里下面的pt表示指向一个元素为5的整型数组。

 我们之前学过&arr是取出整个数组的地址,但是实际值是首元素地址,权限不同,我们可以将其存入数组指针变量中,这样这个指针变量就有其一样的权限。

演示如下:

指针的深入了解4_第6张图片

我们可以看到pt的类型,和&arr的类型相同,这样的话,我们来测试一下它的权限是不是一样大, 我们用*(pt+1)按道理来说这个值应该是超出数组了,应该是随机值。我们来看看:

指针的深入了解4_第7张图片

这也就说明了pt的权限和&arr相同。

 

指针的深入了解4_第8张图片 谢谢

你可能感兴趣的:(c语言,开发语言)