一.指针数组
1.简单介绍:
就像整型数组存放整型,字符数组存放字符一样,指针数组是用来存放指针(地址)的数组;
在定义变量时,我们都知道去掉名字就是类型;
类比来看: int arr1[10], 去掉名字 int [10]—>[ ]说明了它是一个数组,而int说明数组中储存着的元素整型;
char arr2[10],同理,char [10]表明arr2是一个数组,数组中的元素是字符
所以对于指针数组:存放指针的数组 —> int* arr[10] 存放整型指针;char* arr[10]存放字符指针...
//简单举例:
#include<stdio.h>
int main()
{
int a = 10; // int* pa = &a;
int b = 20; // int* pb = &b;
int c = 30; // int* pc = &c;
int* arr[3] = { &a,&b,&c };
for (int i = 0; i < 3; i++)
{
printf("%p ", arr[i]); //符合数组中元素在内存中连续存放
} //&arr[i]内存连续变化
printf("\n");
for (int i = 0; i < 3; i++)
{
printf("%d ", *(arr[i]));//通过指针数组找到变量地址,再解引用找到元素
}
return 0;
}
2.应用:
指针数组通常在需要操作一组地址时非常有用,比如你需要传递多个指针作为参数,一个一个的传参很不方便,这时,你发现作为参数的每一个指针类型都相同,就可以先把变量的指针存到数组里,再把数组作为参数传递会方便很多。
3.指针数组模拟二维数组:
原理:一般情况下数组名==首元素地址,把数组名储存到指针数组中,就拥有了每个数组首元素的地址,那么越过相应的内存就能找到各个元素。
arr1 |
1 |
2 |
3 |
arr2 |
2 |
3 |
4 |
arr3 |
3 |
4 |
5 |
#include<stdio.h>
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* arr[] = { arr1,arr2,arr3 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);// 等同于 *( *(arr+i) + j ) --(之前有过说明)
} // arr+i 找到arr第i+1个元素;*(arr+i) 找到arr1/arr2/arr3数组名;
printf("\n"); // *(arr+i) + j找到整型数组中第j+1个元素的地址;*( *(arr+i) + j ) 找到第j+1个元素
}
return 0;
}
二.数组指针:
1.简单介绍:
(1)整型指针:指向整型的地址;
(2)字符指针:指向字符的地址;
(3)数组指针:指向数组的地址;
唯一需要注意的是:若int * p[10];去掉名字 int* [ ]就成了指针数组(p会和[ ]先结合)
所以我们要让p先和*结合说明它是个指针,那么在定义数组指针时:int(*p)[10] —>int(*)[ ] 这是指针,指向(int [])整型数组;
2.数组指针的初始化:
用&+数组名即可