目錄
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),江北企業(yè)網(wǎng)站建設(shè),江北品牌網(wǎng)站建設(shè),網(wǎng)站定制,江北網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,江北網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。1.字符指針
2.指針數(shù)組
3.數(shù)組指針
4.指針參數(shù)
5.函數(shù)指針
6.函數(shù)指針數(shù)組
6.1模擬加減乘除計算器
6.2指向函數(shù)指針數(shù)組的指針
1.字符指針
int main()
{
const char* p = "abcdefg";
//*p = 'hijklmn';
printf("%s ", p);
printf("%c\n", *p);
return 0;
}
這里的p是一個字符指針,指向字符串首字母的地址,加上const后無法修改,更加嚴(yán)謹(jǐn)。
結(jié)果為 abcdefg a??
那字符指針和字符串以及字符數(shù)組有什么區(qū)別呢?來道改編的面試題看看叭~
int main()
{
char str1[] = "hello world.";
char str2[] = "hello world.";
const char* str3 = "hello world.";
const char* str4 = "hello world.";
if (str1 == str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if (str3 == str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
str1 和 str2 是兩個不同的數(shù)組,相同的常量字符串去初始化不同的數(shù)組的時候會開辟出不同的內(nèi)存塊,各自獨立占用一塊空間;str3 和 str4 指向同一個常量字符(無法改變),當(dāng)幾個指針指向同一個字符串的時候,實際會指向同一塊內(nèi)存。
再來看這道面試題,str1 和 str2 都指向的是數(shù)組首元素的地址,內(nèi)存開辟的空間不同,數(shù)組首元素的地址肯定不同,所以 str1 != str2?;而 str3 和 str4 指向的是同一塊內(nèi)存,所以 str3 == str4。
2.指針數(shù)組不同于一維數(shù)組和二維數(shù)組,指針數(shù)組中各個元素之間地址不是連續(xù)的。
int* arr1[10];? ? ?//一級整形指針的數(shù)組
char *arr2[10];? //一級字符指針的數(shù)組
char **arr[10];? ?//二級字符指針的數(shù)組
先來兩個例子練練手:
int main()
{
//加const更嚴(yán)謹(jǐn),不加也可
const char* arr[4] = { "abc","def","ghi","jkl" };
int i = 0;
for (i = 0; i< 4; i++)
{
printf("%s\n", arr[i]);
}
return 0;
}
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 2,3,4,5,6 };
int arr3[5] = { 3,4,5,6,7 };
int* arr[3] = { arr1,arr2,arr3 };
int i, j;
for (i = 0; i< 3; i++)
{
for (j = 0; j< 5; j++)
{
printf("%d\n", arr[i][j]);//這里與二維數(shù)組很像
} //*(arr[i]+j)或*(*(arr+i)+j)也可
printf("\n");
}
return 0;
}
3.數(shù)組指針數(shù)組指針——存放數(shù)組地址的指針——指向數(shù)組的指針
格式:int (*p)[10] = &arr; 其中 *p?相當(dāng)于 arr?arr 只是首元素的地址,&arr 取出的是數(shù)組的地址,只有數(shù)組的地址需要數(shù)組來接收;p?先和 * 結(jié)合,說明 p?是一個指針變量,指向一個大小為10個的 int 型的數(shù)組。
注意:[ ]的優(yōu)先級高于 * ,所以必須加上()來保證 p?先和 * 結(jié)合。
//一維
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int(*p)[10] = &arr;
int i = 0;
for (i = 0; i< 10; i++)
{
printf("%d ", (*p)[i]);
} //*p相當(dāng)于arr,即arr[i]
return 0;
}
//二維
void Print(int(*p)[4], int row, int col)
{ //指向第一行的四個元素
int i, j;
for (i = 0; i< row; i++)
{
for (j = 0; j< col; j++)
{
printf("%d", (*(p + i))[j]);
} //p[i][j]也可
printf("\n");
}
}
int main()
{
int arr[3][4] = { {1,2,3,4},{2,3,4,5},{3,4,5,6} };
Print(arr, 3, 4);//二維數(shù)組名是第一行的地址
return 0;
}
int arr[10] | 整形數(shù)組,數(shù)組里有10個 int 類型的元素 |
int *parr1[10] | 指針數(shù)組,數(shù)組里有10個 int* 類型的元素 |
int (*parr2)[10] | 數(shù)組指針,指向一個有10個 int 類型元素的數(shù)組, |
int (*parr3[10])[5] | 數(shù)組指針數(shù)組,parr3是有10個 int(*)[5]的數(shù)組指針類型元素的數(shù)組 |
//一級指針傳參
void test(int* p)
{
;
}
int main()
{
int n = 10;
int* p = &n;
int arr[10];
test(&n);//ok
test(p);//ok
test(arr);//ok
return 0;
}
//二級指針傳參
void test(int** p)
{
;
}
int main()
{
int n = 10;
int* p = &n;
int** pp = &p;
int* arr[10];
test(&p);//ok
test(pp);//ok
test(arr);//ok
return 0;
}
這里真的是很懵,還是要多加練習(xí)?。?!
5.函數(shù)指針函數(shù)指針——指向函數(shù)的指針
格式:int (*pf)(int, int) = &Add;
與數(shù)組不同,&函數(shù)名 和 函數(shù)名 都是函數(shù)的地址。
int Add(int x, int y)
{
return x + y;
}
int main()
{
printf("Add的地址為:%p\n", &Add);
int (*pf)(int, int) = &Add;//pf為函數(shù)指針,存放函數(shù)地址
//&Add 等價于 Add
int ret1 = Add(2, 3);
int ret2 = (*pf)(2, 3);//*pf = Add
int ret3 = pf(2, 3);//pf = Add
int ret4 = (******pf)(2, 3);//*只是個擺設(shè),無論前面有多少個*程序都不會用
printf("%d %d %d %d\n", ret1, ret2, ret3, ret4);
return 0;
}
6.函數(shù)指針數(shù)組6.1模擬加減乘除計算器字符指針數(shù)組:char* arr1[10];
整型指針數(shù)組:int* arr2[10];
函數(shù)指針數(shù)組:int (*arr3[5]) (int , int);
int (*pf[5])(const char*) = {&Add};
#define _CRT_SECURE_NO_WARNINGS
#include//用宏定義更加簡便
//#define Add(x,y) (x+y)
//#define Sub(x,y) (x-y)
//#define Mul(x,y) (x*y)
//#define Div(x,y) (x/y)
int Add(int x, int y)
{
return x + y;
}int Sub(int x, int y)
{
return x - y;
}int Mul(int x, int y)
{
return x * y;
}int Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("********** Ji Suan Qi **********\n");
printf("********************************\n");
printf("******* 1.add 2.sub *******\n");
printf("******* 3.mul 4.div *******\n");
printf("******* 0.exit *******\n");
printf("********************************\n");
}
int main()
{
int input = 0;
int x, y;
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("請輸入兩個數(shù):");
scanf("%d%d", &x, &y);
printf("%d\n", Add(x, y));
break;
case 2:
printf("請輸入兩個數(shù):");
scanf("%d%d", &x, &y);
printf("%d\n", Sub(x, y));
break;
case 3:
printf("請輸入兩個數(shù):");
scanf("%d%d", &x, &y);
printf("%d\n", Mul(x, y));
break;
case 4:
printf("請輸入兩個數(shù):");
scanf("%d%d", &x, &y);
printf("%d\n", Div(x, y));
break;
case 0:
printf("退出計算器\n");
break;
default:
printf("選擇錯誤,請重新選擇\n");
break;
}
} while (input);
return 0;
}
我們發(fā)現(xiàn),這樣寫雖然邏輯清晰,但過程太過繁雜,而且不論是函數(shù)還是case語句格式相通,既然這樣,不妨試一試函數(shù)指針數(shù)組,看看能否簡化程序。
#define _CRT_SECURE_NO_WARNINGS
#includeint Add(int x, int y)
{
return x + y;
}int Sub(int x, int y)
{
return x - y;
}int Mul(int x, int y)
{
return x * y;
}int Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("********** Ji Suan Qi **********\n");
printf("********************************\n");
printf("******* 1.add 2.sub *******\n");
printf("******* 3.mul 4.div *******\n");
printf("******* 0.exit *******\n");
printf("********************************\n");
}
int(*pf[5])(int, int) = { 0,Add,Sub,Mul,Div };//第一個元素放0是為了讓后面元素下表對應(yīng)菜單選項
int main()
{
int input = 0;
int x, y;
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
if (input == 0)
{
printf("退出計算器\n");
break;
}
else if (input >= 1 && input<= 4)
{
printf("請輸入兩個數(shù):");
scanf("%d%d", &x, &y);
int ret = pf[input](x, y);//?。?!
printf("%d\n", ret);
}
else
printf("輸入錯誤\n");
} while (input);
return 0;
}
答案是肯定的,使用函數(shù)指針數(shù)組后case語句可以省略,代碼的可讀性更強。
6.2指向函數(shù)指針數(shù)組的指針(無限套娃 o.O ……)
函數(shù)指針數(shù)組:int (*pf[5])(int,int);
指向函數(shù)指針數(shù)組的指針:int? ( * ( *ppf ) [5] ) ( int , int ) = &pf;
看變量類型: 把變量名去掉;看數(shù)組中元素的類型:把()里*之后的部分去掉。
難哇,學(xué)?。?/p>
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁題目:【C語言】指針進階(1)-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://jinyejixie.com/article20/dcphjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、搜索引擎優(yōu)化、關(guān)鍵詞優(yōu)化、網(wǎng)站收錄、做網(wǎng)站、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容