8.4指针数组、指向指针的指针、main函数的参数、指针小结、关于void类型和const

一个人想着一个人 提交于 2020-02-25 10:45:30

(七)指针数组

概念:一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量。
一维指针数组的定义形式为:

类型名 *数组名[数组长度];
例如:
int *name[4];

由下图可知:

  • 程序前两句和第三句相等。

  • 指针数组元素的的值为数组中元素的值的首地址。
    如:指针数组pa1的第0个元素pa1[0]的值为0x0018fef0,指向数组stra[0]的首地址。
    在这里插入图片描述
    用例:将字符串按字母排序(由小到大)输出。

    #include <stdio.h>
    #include <string.h>
    
    void main()
    {  
    	void sort(char *array[], int n);
    	void print(char *array[], int n);
    	char *name[] = {"Hello world", "hello world", "hello", "china"};
    
    	sort(name, 4);
    	print(name, 4);
    }
    
    void sort(char *array[], int n)
    {
    	int i, j, m;
    	char *temp;
    
    	for(i = 0; i < n; i++){
    		for(j = i + 1; j < n; j++){
    			m = strcmp(array[i], array[j]);//以ASCII码的大小进行对比
    			if(m == 1){ 	//非0为真
    				temp = array[i];
    				array[i] = array[j];
    				array[j] = temp;
    			}
    		}
    	}
    }
    
    void print(char *array[], int n)
    {
    	int i;
    	for(i = 0; i < n; i++){
    		printf("%s\n", array[i]);
    	}
    }
    

    在这里插入图片描述

(八)指向指针的指针

概念:如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
定义一个指向指针型数据的指针变量:

char **p; 

p前面有两个*号,表示指针变量p是指向一个字符指针型变量的。
用例:(直接给pptr=&var其实也是可以的)

int main ()
{
   int  var;
   int  *ptr;
   int  **pptr;

   var = 3000;
   /* 获取 var 的地址 */
   ptr = &var;
   /* 使用运算符 & 获取 ptr 的地址 */
   pptr = &ptr;
   /* 使用 pptr 获取值 */
   printf("Value of var = %d\n", var );
   printf("Value available at *ptr = %d\n", *ptr );
   printf("Value available at **pptr = %d\n", **pptr);

   return 0;
}

(九)main函数的参数

习惯上main函数这两个参数写为 argc (整型变量)和 argv (指向字符串的指针数组)。
main函数的函数头应写为:

main (int argc,char *argv[])

argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。
argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。
用例:

#include <stdio.h>

void main(int argc, char *argv[])
{
	printf("%d\t",argc);
	while(argc--){
		printf("%s\t", argv[argc]);
	}
	printf("\n");
}

在这里插入图片描述

(十)main函数的参数有关指针的数据类型和指针运算的小结

1.有关指针的数据类型的小结

定义 含义
int i 定义整型变量i
int *p p为指向整型数据的指针变量
int a[n] 定义整型数组a,它有n个元素
int *p[n] 定义指针数组p,它由n个指向整型数据的指针元素组成
int (*p)[n] p为指向n个元素的一维数组的指针变量
int f() f为带回整型函数值的函数
int *p() p为带回一个指针的函数,该指针指向整型数据
int (*p)() p为指向函数的指针,该函数返回一个整型值
int **p p是一个指针变量,它指向一个指向整型数据的指针变量

2.指针运算的小结

  • 1). 指针变量加(减)一个整数
    例如:p++、p–、p+i、p-i、p+=i、p-=i
    一个指针变量加(减)一个整数并不是简单地将原值加(减)一个整数,而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数加(减)。
  • 2). 指针变量赋值:将一个变量的地址赋给一个指针变量。
    p=&a; (将变量a的地址赋给p)
    p=array; (将数组array的首地址赋给p)
    p=&array[i]; (将数组array第i个元素的地址赋给p)
    p=max; (max为已定义的函数,将max的入口地址赋给p)
    p1=p2; (p1和p2都是指针变量,将p2的值赋给p1)
    注意:不能如下:p=1000;
  • 3). 指针变量可以有空值,即该指针变量不指向任何变量。
    p=NULL
  • 4). 两个指针变量可以相减:如果两个指针变量指向同一个数组的元素,则两个指针变量值之差是两个指针之间的元素个数。
    指针相减 = (地址1-地址2)/sizeof(类型)
    void main(int argc, char *argv[])
    {
    	int a[]= {12, 45, 6, 7, 4, 45, 1};
    	int *p1, *p2;
    	p1 = &a[1];		//0x0018ff28
    	p2 = &a[5];		//0x0018ff38
    
    	printf("%d\n", p2-p1);  //显示4
    }
    
  • 4).两个指针变量比较:如果两个指针变量指向同一个数组的元素,则两个指针变量可以进行比较。指向前面的元素的指针变量“小于”指向后面的元素的指针变量。

(十一) 关于void类型

  1. void真正发挥的作用在于:
    1). 对函数返回的限定;
    2). 对函数参数的限定。

    例如:void func(void)
    
  2. void指针
    ANSI新标准增加了一种“void”指针类型,即可以定义一个指针变量,但不指定它是指向哪一种类型数据。

    例如 : void *p;
    

    1). 表示指针变量p不指向一个确定的类型数据,它的作用仅仅是用来存放一个地址。
    2). void指针它可以指向任何类型数据。也就是说,可以用任何类型的指针直接给void指针赋值。但是,如果需要将void指针的值付给其他类型的指针,则需要进行强制类型转换。

(十二) const

#include <stdio.h>

void main(int argc, char *argv[])
{
	const char *str1 = "I love china";
	char * const str2 = "I love china";
	const char * const str3 = "I love china";

	//str1[0] = 'w';   //非法
	str1 = 'hello world';	//合法
	printf("%s", str1);

	str2[0] = 'w';   //合法
	str2 = 'hello world';	//非法
	printf("%s", str2);

	str3[0] = 'w';   //非法
	str3 = 'hello world';	//非法
	printf("%s", str3);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!