总结:主要看后面的两个字是什么(前面是修饰作用),因此指针数组是数组,而数组指针是指针。
指针数组
指针数组:是指一个数组里面装着指针,也即指针数组是一个数组;
定义形式:int *a[10];
说明
:[]
的优先级高于*
,该定义形式应该理解为:int * (a[10]);括号里面说明a是一个数组,包含了10
个元素,括号外面说明每个元素的类型为int *。
#include <stdio.h>
int main(){
int a = 16, b = 932, c = 100;
//定义一个指针数组
int *arr[3] = {&a, &b, &c};//也可以不指定长度,直接写作 int *arr[]
//parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,
//它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。
//arr 第 0 个元素的类型为 int *,所以在定义 parr 时要加两个 *。
int **parr = arr;
printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);//16, 932, 100
printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));//16, 932, 100
return 0;
}
数组指针
数组指针:是指一个指向数组的指针,它其实还是一个指针,只不过是指向数组而已;
定义形式:int (*p)[10];
该指针变量保存的是一个数组的首地址,它指向一整个数组(),数组的类型为int[10]
int main(void)
{
char a[5]={'A','K','C','G','L'};
char (*p)[5]=&a;//&a代表的是整个数组的首地址
//char (*p)[5]=a;这样是错误的,因为a代表第一个元素的首地址
printf("%c %c %c",**p,*(*p+1),*(*p+3));//输出:A K G
return 0;
}
说明:a代表的是第一个元素的地址,即:&a[0],而&a代表的是整个数组的地址。a+1代表的是下一个元素的地址,即&a[1],而&a+1代表的是向后移动5个字节的地址。这里为什么用的二级指针呢?因为p=&a,p即为第一个元素的地址,再p即输出了第一个元素。同理,(p+1),(*p+3)输出第二个元素,第四个元素。
二维数组
a 数组包含3行,即3个行元素:a[0]、a[1]、a[2]。
image.png#include <iostream>
#include <string>
#include <cstdio>//声明sprintf
using namespace std;
void InitPointer(int **ptr, int length, int default_value) {
*ptr = (int*)malloc(sizeof(int) * length);
cout<< *ptr<<endl;
for (int i = 0; i < length; ++i) {
(*ptr)[i] = default_value;
}
}
int main()
{
int * ptr =nullptr;
cout<<ptr<<endl;
InitPointer(&ptr,2,2);
for (int i = 0; i < 8; i++)
{
cout<<ptr[i]<<endl;
}
cout<<ptr<<endl;
cout<<(ptr == nullptr) <<endl;
free(ptr);
}
网友评论