指针是什么?
1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2.指针的大小是固定的4/8个字节(32位平台/64位平台)。
3.指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。
4.指针的运算。
就如同我们住的宾馆有房间号一样,其实,在计算机中。计算机存储是有编号的。
那对于这个编号,我们一般成为指针。
即:内存编号 = 地址 =指针
指针或者地址,其实它也可以被存储
那么它就被存储到指针变量中
①指针数组 - 存放指针的数组
②数组指针 - 指向数组的指针
一、指针数组
其实指针数组,就是存放只指针的数组
比如代码:
int (*arr)[10];
其实就是表示创建一个数组,数组的元素为指针。一共有10个
用图解释下:
例如下面代码:
int main()
{
int a = 10;
int b = 20;
int c = 30;
int* pa = &a;
int* pb = &b;
int* pc = &c;
int* arr[3] = { &a,&b,&c };
return 0;
}
运行程序,可以观察到我们把a b c的地址保存在数组arr中,arr中存储的就是对应地址的值
将arr3中存储的地址改为指向他们的指针运行程序,会发现一样也可以找到a b c对应的值:
类似于arr这个数组,如果保存指针的话,可以访问到指针指向的变量
像这样的数组,就称之为指针数组。数组内部保存的是指针。
那数组指针有什么用法呢?
int arr1[5]={1,2,3,4,5};
int arr2[5]={2,3,4,5,6};
int arr3[5]={3,4,5,6,7};
类似于这样的三个数组,如果我们想遍历打印他们的内容。
就可以将他们的数组首元素地址保存在一个指针数组之中。如下:
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 2,3,4,5,6 };
int arr3[5] = { 3,4,5,6,7 };
int* parr[3] = { 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[i])+j 代表的就是将parr中的第i个数组的地址解引用,然后找里面的第j个元素
二、数组指针
就如同
字符指针 - 指向字符的指针,存放的是字符变量的地址
整型指针 - 指向整型的指针, 存放整型变量地址的
数组指针 - 指向数组的指针,存放数组的地址
指针的作用不就是找到对应变量的地址,然后对其进行操作么,统一,数组指针也是指向数组的指针,通过它就可以访问到数组。
例如写一个函数打印数组的内容,代码如下:
//形参写成数组的形式
void print1(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//形参写成指针的形式
void print2(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr + i));
}
printf("\n");
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//写一个函数打印arr数组的内容
int sz = sizeof(arr) / sizeof(arr[0]);
printf("数组打印形式:\n");
print1(arr, sz);
printf("指针打印形式:\n");
print2(arr, sz);
return 0;
}
可以看到他们打印出的结果都是一样的
但是,我前面的文章说过,当用数组作为形参传递时,在内存中真的会开辟出来一片内存来给程序使用。这样很容易造成内存空间的浪费
采用只指针的方式进行访问,可以节省很多内存空间。