一个数组A,A中每个元素都是指针类型,如果A中的一个元素B在内存中的值是0,那么就说B是空指针

下面的示例定义一个长度为3的数组,数组中每个元素的类型都是char的指针,但是每个元素的内容都是0,那么言外之意就是说这个数组里面装着3个空指针

#include "stdio.h"

int main(void){
char * A[3]={0};
}

下面的示例定义了两个数组,然后放到A的前两个位置

#include "stdio.h"

int main(void){
char * A[3]={0};
char arr1[]="abc";
char arr2[]="def";
//将指向arr1第一个元素的指针放到A[0]位置
A[0]=arr1;
//将指向arr2第一个元素的指针放到A[1]位置
A[1]=arr2;
//此时,A[2]的值依然为0,所以A[2]是空指针,而A[0]和A[1]不再是空指针
}

下面的代码打印出上述示例的内容

#include "stdio.h"

int main(void){
char * A [3]={0};
char arr1[]="abc";
char arr2[]="def";
A[0]=arr1;
A[1]=arr2;

// p是一个指针,它指向的内容也是一个指针
char ** p=A;
// 如果p指向的内容(*p)不是一个空指针,则说明这个内容是arr1或者arr2的首元素地址
while(*p!=0){
puts(*p);
p++;
}
}

上述的示例演示完毕,同理,下面的示例打印main函数的入参,遇见空指针则停止

#include "stdio.h"

int main(int len,char * * arg){
while(*arg!=0){//如果元素不是空指针,则打印内容
puts(*arg++);
}
}

gcc编译之后默认生成a.out文件,输入下面的命令观察上述函数的打印结果

./a.out a b c

打印内容如下

./a.out
a
b
c