第九章 指針
第九節 指針數組, 指針的指針, 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;
}
總結
-
優點: 效率高
-
缺點: 太過靈活