第九章 指针
第九节 指针数组, 指针的指针, main函数参数, 小节
1. 指针数组概念回顾
一个数组,其元素均为指针类型数据,称为指针数组,
指针数组的定义形式:
类型标识符 *数组名[数字长度说明] //int *p[4],每个数组元素都可以看作是一个指针变量,
都可以指向一个指针变量数组指针 int (*p)[4],指向一维数组的指针变量
#include<iostream>#include<cstring>intmain(){//指针数组char*pName[]={"C++","JAVA","PYTHON","GO","CSHARP"};intbytes=sizeof(pName);//每个指针变量占8个字节,这点要注意!!printf("bytes of pName: %d\n",bytes);intlen=sizeof(pName)/sizeof(char*);printf("length of pName: %d\n",len);printf("%d\n",sizeof(char));char*p2="JAVA";//把字符串的首地址赋给指针inti;for(i=0;i<len;i++){printf("pName[%d]: %s\n",i,pName[i]);}printf("************************\n");char*ptmp;ptmp=pName[0];//ptmp指向C++pName[0]=pName[1];//pName[0]指向JAVApName[1]=ptmp;//pName[1]指向C++for(i=0;i<len;i++){printf("pName[%d]: %s\n",i,pName[i]);}printf("************************\n");return0;}2. 指向指针的指针
- 用来指向指针变量的变量,简称指向指针的指针
// *(*p)表示指针变量p指向指针变量,*p是p所指向的指针变量char**p;//定义了一个指向字符串指针变量的指针变量int**pInt;//定义了一个指向整型指针变量的指针变量- 实例
#include<iostream>#include<cstring>intmain(){//指针数组char*pName[]={"C++","JAVA","PYTHON","GO","CSHARP"};char**pp;//定义了一个指向字符串指针变量的指针变量pp=&pName[0];//*pp = pName[0]printf("*pp = %s\n",*pp);intabc=5;int*pabc=&abc;//指向整型数据的指针int**ppabc=&pabc;//指向指针的指针printf("abc = %d\n",abc);printf("*pabc = %d\n",*pabc);printf("**ppabc = %d\n",**ppabc);return0;}3. 指针数组做main函数形参
指针数组的重要应用是能够做main函数的参数
指针数组可以接收不确定长度的参数,灵活性很强
#include<iostream>#include<cstring>//添加了两个形参,第一个形参整型,第二个形参是指针数组// argc保存的是argv指针数组的元素个数// argv[0]保存的是当前可执行文件的完整路径文件名intmain(intargc,char*argv[]){inti;printf("argc: %d\n",argc);for(i=0;i<argc;i++){// printf("argv[%d]: %s\n", i, argv[i]);printf("argv[%d]: %s\n",i,*argv);argv++;}return0;}4. 本章小节
指针数据类型
| 定义 | 含义 |
|---|---|
| int 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是一个指针变量,指向另外一个整型数据的指针 |
指针运算小结
指针变量的加减(p++, p–)
指针变量的赋值(int *p,不能直接赋值地址),只能够将变量已经分配的
地址赋值给指针变量指针变量可以为空值,表示不指向任何变量
// NULL就是整数0,使p指向地址为0的单元// 系统会保证地址为0这个单元不存放任何有效数据int*p=NULL;if(p==NULL){p=&a}- void*型指针:万能型指针变量
#include<iostream>#include<cstring>intmain(intargc,char*argv[]){inta=3;int*p=&a;floatbf=56.f;float*pf=&bf;void*pwn=NULL;pwn=p;pwn=pf;pf=(float*)pwn;return0;}总结
优点: 效率高
缺点: 太过灵活