指针数组概念
一個數組,其元素均為指針類型數據,稱為指針數組。
? ? ? ? ? ? ? ? ? ? ? ? ? ?即:指針數組中每一個元素都是指針變量。
指針數組的定義格式:
? ? ? ? ? ? ? ? ? ? 類型標識符 *數組名(數字長度說明);
如:
? ? ? ? ? ? ? ? ? ? int *p[4];? ?//每個數組元素都可以看成是一個指針變量,都可以指向 一個整型普通變量。
? ? ? ? ? ? ? ? 數組指針:int (*p)[4];? ? ?//這是指向一維數組的指針變量,也就是說,他首先是一個指針變量。
例題:
#include<stdio.h>int main() {char *pName[]={"C++","JAVA","PYTHON","GO","CSHarp"}; //指針數組int is1=sizeof(pName); //每個指針變量占4個字節,所以有五個元素一共占20個字節int isize=is1/sizeof(pName[0]); //20/4=5,表示pName中有5個元素,pName能引用的下標就是[0]-[4]int i;char *p2="JAVA"; //把字符串的首地址賦值給指針;字符串常量會固定分配地址;p2=pName[1]for(i=0;i<isize;i++){printf("pName[%d]=%s\n",i,pName[i]);}printf("----------------------------------\n");char *ptemp;ptemp=pName[0]; //ptemp指向了"C++"pName[0]=pName[1]; //pName[0]指向了"JAVA"pName[1]=ptemp; //pName[1]指向了"C++"/*ptemp保存了"C++"的地址,然后pName[1]保存了"JAVA"的地址,最后再把"C++"的地址給pName[2].*/for(i=0;i<isize;i++){printf("pName[%d]=%s\n",i,pName[i]);}printf("----------------------------------\n");return 0; } 二、指向指針的指針 用來指向指針變量 的變量,簡稱:指向指針的指針。 char **p;? ? //定義了一個 指向? 字符串指針變量的? 指針變量 int **p;? ? ? ?//定義了一個 指向? 整型指針變量的? 指針變量 *(*p);? ?//表示? 指針變量p? 是? 指向一個? 指針變量,*p 是 p? 所指向的 指針變量。?
接上方代碼char **pp; //定義一個指向指針的指針pp=&pName[0]; //*pp就是pp所指向的指針,也就是pName[0];printf("pp=%s\n",*pp);printf("----------------------------------\n");int abc=5;int *pabc=&abc; //指向 整型數據的指針 *pabc保存的是 abc的地址int **ppabc=&pabc; //指向 指針的指針 **ppabc保存的是 [*pabc保存的地址(就是abc的地址)]printf("abc=%d\n",abc);printf("abc=%d\n",*pabc);printf("abc=%d\n",**ppabc); //*ppabc 等價于 pabc,所以 **ppabc 等價于 abcreturn 0; } 三、指針數組做main函數形參 指針數組有個重要應用: 第一種傳遞形參的方法: 第一種方法: 第一種方法:int main(int arge,char *argv[]) //int arge:整型形參 應該是argv指針數組的元素個數//char *argv[]:指針數組做函數形參argv[0]保存的是 當前可執行文件的完整路徑文件 名;可以接收不確定參數個數 {int i;printf("argc=%d\n",arge); //我們輸入的參數個數 +1for(i=0;i<arge;i++){printf("argv[%d]=%s\n",i,argv[i]);//等價于上面一條代碼printf("argv[%d]=%s\n",i,*argv);argv++;}printf("-------\n");return 0; }第二種傳遞形參的方法(使用命令行):
四、本章小結 1、指針數據類型小結表 2、指針運算小結 ① 指針變量的 加減 p++;p-- int *p;? 1000;1004 ②指針變量的 賦值 int *p =1000; //這樣是 不可以的,不能直接賦予數字,不要認為可以將地址賦值給p,只能夠將變量的已經分配的地址賦值給指針變量。 int a; int *p=&a;? //只可以這樣 ③指針變量 可以為空值, 表示不指向任何變量 int *p=NULL;? //NULL就是整數0,就是使p指向地址為0的單元; //系統會保證地址為0這個單元不存放有效數據 if(p==NULL) { //p=&a; } 3、void? *型指針:萬能型指針變量,也就是 能夠指向任意數據類型; int a=3; int *p=&a; float bf=56.f; float *pg=&bf; void *pwn=NULL; pwn=p;? ?//可以把整型變量的地址賦值給萬能型指針變量 pwn=pf;? ?//這個也可以把上面bf的地址賦值給他 pf=(float *)pwn;? //這里把pwn的地址賦值回給pf必須強制類型轉換 4、總結 指針的優點: 效率高 指針的缺點: 太過靈活?
?
總結
- 上一篇: java孙膑和庞涓问题_庞涓VS孙膑——
- 下一篇: dwwd