C语言----双重指针与数组(高阶篇三十五)
多维数组与指针
指向一维数组的指针,定义格式为:
int *pa;
int a[5];
pa=a;
指向三维数组的指针,定义格式为:
int (*pa)[5][8]
int a[3][5][8];
pa=a;
从定义格式中我们看出,指向多维数组的指针,只有将第一维变成指针,后面的格式保持不变才能进行赋值。
指向二维数组的指针定义格式为:
int (*pa)[8];
int a[3][8];
pa=a;
※按照以上规律,如果函数之间要传送一个多维数组,可用下面三种定义:
void fun ( int (*pa)[5][8],int n){…}
void fun ( int a[][5][8],int n){…}
void fun ( int a[3][5][8],int n){…}
再用以下方式调用:
int a[3][5][8]={0};
fun(a,3); // 只将第一维的元素值,传值。 fun( a, 3) “ 3 ” 是:int a[3][5][8]
这样理解可以简化成按一维数组的传送方式进行传送。
指针的指针
每个变量都有地址,包括指针变量,如果要存储指针变量的地址,那只能定义一个指针的指针,也叫双重指针,如:
int **ppa,*pa;
ppa=&pa;
双重指针一般和指针数组配合使用。
程序1
双重指针
// 35-1双重指针.c #include <stdio.h> main() { char *ca[] = { "aaa","bbb","ccc" }; // *ca[] == **ca char **pa = ca; //因为 *ca[] == **ca **pa = ca 不用& for (int i = 0; i < 3; i++) printf("%s\n", *pa++); // 分解: *pa pa++ }
※char **p={“aa”,”bbb”,”cccc”}非法,而char *ca[]={"aa","bbb","cccc"}合法。因为**p只能指向一个指针,而ca[]可以为字符串分配内存空间,它们道不同不相为谋。
注意:
※指针的指针不能直接指向多维数组,如:
int **ppa,a[3][3];
ppa=a;
这是不允许的
※“双重指针不能定义字符串,不能指向二维数组”
main函数参数
Windows中有个“命令行模式”,源自于它的曾曾曾祖父操作系统“DOS”,在没有鼠标的情况下,它可以通过给计算机发文字指令的方式来完成操作系统的大部分工作。
比如copy a.txt b.txt命令,会将文件a.txt复制到文件b.txt中去。
Windows命令是怎么做出来的。
main函数还有一种格式:
main(int argc,char *argv[]) //int argc负责接收字符串的个数,char *argv[]负责接收若干字符串。
根据“多维数组与指针”的概念,实际上main函数接收的就是一个字符串数组。int argc负责接收字符串的个数,char *argv[]负责接收若干字符串。
程序2
带参数的main函数
// 35-2带参数的main函数.c #include <stdio.h> main(int argc,char *argv[]) { int i = 0; printf("参数个数:%d\n", argc); while (i< argc) { //printf("%s\n", argv[i]); printf("%s\n", *(argv++)); //获取数组参数 i++; } }
※字符串数组下标从0开始记数,文件名本身也算1个参数,如:copy a.txt b.txt中的copy也算1个参数,它的下标是0。
※中文和英文的编码格式不同,因此在编程时为减少错误的发生,尽量少用中文。