//二级指针第一种内存模型 #include<stdio.h> #include<stdlib.h> //说明:①:类似于int a[5]={0},数组名a是一维数组a中首元素的指针;(我自认为此假设可应用于多维数组与指针) //②二级指针的主要功能是修改一级指针的值 //打印一维数组 int PrintArr(char **pin, int num){ int ERRO_MSG = 0; if (pin == NULL) { ERRO_MSG = 1; printf("pin==NULL erro msg:%d ", ERRO_MSG); return ERRO_MSG; } //打印二级指针数组 int i = 0; for (i = 0; i < num; i++) { //pin是一维数组首元素的指针,每个元素都是一个指针,pin的类型是指针类型 //所以pin的步长是4个字节, //pin + i是第i个元素的指针,第i个元素的值就是*(pin + i),这个元素是指针 //指针的步长只与指针的类型有关系 //例子: int a[5]={0}; a是数组首元素的指针,a的类型是 int * a; //&a是数组指针(C语言语法规定);&a的类型是 int (* p)[5]--一个指向数组的指针类型 //int (* p)[5] 是个指针类型 明确这一点 和int * p[5]是完全不同的两种类型 //后面的章节会详解 printf("*--%s ", *(pin + i)); printf("[]--%s ", pin[i]); } return ERRO_MSG; } void main(){ //第一种使用方式 //[]的优先级高于 * //因此char * myarr[] 首先是一个一维数组, //char *表明这个一维数组里每个元素的数据类型是 char *,(字符指针) //myarr是数组名,[]是数组的大小 //myarr表示的是数组首元素的指针(不是首元素的值) //本数组首元素是一个指针a,那么myarr就是指针a的指针,也就是myarr是一个二级指针 char * myarr[] = { "aaabsdafa", "bbb", "ccc", "ddd" }; //C语言规定 sizeof(数组名) 得到的是整个数组的大小 printf("%d ", sizeof(myarr));// 打印 16 sizeof(char *) * 4=16(元素个数) PrintArr(myarr, 4); system("pause"); }