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