C语言的指针数组,多重指针以及main函数的参数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuyuzun/article/details/82732035

前言

1.本博文基于VC++6.0开发调试运行;
2. 本博文只是对多重指针和指针数组的一个小总结;

指针数组

是什么?是一个数组,是一个元素都是用来存储地址的数组
定义方式:*类型名 数组名[数组长度]

char *P_str[10];

初始化:

char *P_str[] = {"Follow me","BASIC","Great Wall","FORTRAN"};

初始化含义:
这里写图片描述

注意区别:

定义变量 数据类型 含义
int *p[4] int *[4] 定义一个指针数组p,数组由四个指向整型数据的指针元素组成
int (*p)[4] int (*)[4] p为指向包含4个元素的的一维数组的指针变量

数组指针的特点:
(1)**灵活性:**以往的数组中,一个数组名只能确定一段内存空间,对这段固定内存内的变量的读写修改操作,但是数组指针在一个数组内可以指向若干字符串,这样,可以根据需要用一个指针数组名调用不同字符串;
(2)**执行效率方面:**移动指针变量的值要比移动字符串所花的时间少得多;
通过一个例子诠释指针数组的灵活性:
问题:将4个字符串按从小到大打印出来;

#include <stdio.h>
#include <string.h>
void main()
{
	void sort(char *P_name[],int n);
	void print(char *P_name[],int n);
	int n = 4;
	char *P_name[4] = {"Follow me","BASIC","Great Wall","FORTRAN"};

	sort(P_name,n);
	print(P_name,n);
	printf("\n");

}
void sort(char *P_name[],int n)
{
	int i,j;
	char *P_temp = NULL;
	for(i=0;i<n;i++)
		for(j=0;j<n-1;j++)
			if(strcmp(P_name[j],P_name[j+1]) != -1)
			{
				P_temp = P_name[j];     //将原本字符串之间的互相赋值转化为了地址之间的互换,提高程序执行效率
				P_name[j] = P_name[j+1];
				P_name[j+1] = P_temp;
			}
}
void print(char *P_name[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%s\n",P_name[i]);
	}
}

运行结果:
这里写图片描述
注意区分以下区别:(针对以上例子中的指针数组)

标识符 含义
P_str 双重指针变量名;代表指针数组首元素地址的地址,也就是字符串"Follow me"的首地址的地址;
P_str[0] 指针数组首元素(字符串"Follow me")的首字符地址;
*P_str 同上,指针数组首元素的首字符地址;
*P_str[0] 指针数组首元素指向的地址所指向的具体值;即字符串"Follow me"的首字符F;
P_str+1 指针数组下标为1的元素的首字母地址;

多重指针:指向指针的指针;

是什么?首先是个指针(地址),是一个指向另外一个指针(地址)变量的指针变量;
定义:*数据类型 * 指针名

char **p;

初始化:

char *P_name[] = {"Follow me","BASIC","Great Wall","FORTRAN"};
char p = P_name;   //将指针数组首元素"Follow me"的首字母地址的地址复制给双重指针p;

举例:

#include <stdio.h>
void main()
{
	char *P_name[] = {"Follow me","BASIC","Great Wall","FORTRAN"};
	char **p = NULL;
	int i = 0;
	for(;i < sizeof(P_name)/4;i++)
	{
		p = P_name+i;   //数组指针的加减运算,是数组元素首字符地址的变换;
		printf("%s\n",*p);
	}
}

运行结果:
在这里插入图片描述

指针数组做main函数的形参(简介功能,不做深入讨论)

不仅在VC++环境下写过C语言,面对不同的应用,曾经也在VS2010,MDK(单片机开发)环境下写过C语言,可以说的是,各个环境下的C语言应用方向是不同的,比如用MDK开发单片机的时候,并没有所谓的stdio.h文件,main函数的形参完全可以不写任何东西,但是在VS201X里,建立一个工程后,main函数会被默认分配形参,如下:

int main(int argc,char *argv[])

argc : argument count 参数个数;
argv:argument vector 参数向量(字符型指针数组);数组中每个元素(值为地址)都指向命令行中的一个字符串;
备注:这两个形参名字是习惯性起法,不是规定;
什么情况下会用到带参数的main函数那?
在平时编程的时候就知道,main函数是不能被咱们自己写的函数调用的,它是由操作系统调用的,并且操作会给它的形参传递实参。通常在编写C程序的时候,main函数调用其他函数,形成一个完整的系统,这个系统被编译器最终生成可执行文件.exe,用户双击这个文件,操作系统就会调用这个main函数,并在操作命令状态下,实参是和执行文件命令一起给出的。比如在DOS,UNIX或LINUX等操作系统的命令状态下,在命令行中包括了命令名和需要传给main函数的参数;

猜你喜欢

转载自blog.csdn.net/wuyuzun/article/details/82732035