【C語言】指針進階(1)-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,江北企業(yè)網(wǎng)站建設,江北品牌網(wǎng)站建設,網(wǎng)站定制,江北網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,江北網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?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后無法修改,更加嚴謹。

結(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 指向同一個常量字符(無法改變),當幾個指針指向同一個字符串的時候,實際會指向同一塊內(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更嚴謹,不加也可
	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?相當于 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相當于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ù)組
4.指針參數(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;
}

這里真的是很懵,還是要多加練習?。?!

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);//*只是個擺設,無論前面有多少個*程序都不會用
	printf("%d %d %d %d\n", ret1, ret2, ret3, ret4);
	return 0;                  
}

6.函數(shù)指針數(shù)組

字符指針數(shù)組:char* arr1[10];

整型指針數(shù)組:int* arr2[10];

函數(shù)指針數(shù)組:int (*arr3[5]) (int , int);

int (*pf[5])(const char*) = {&Add};

6.1模擬加減乘除計算器
#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是為了讓后面元素下表對應菜單選項
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ù)組中元素的類型:把()里*之后的部分去掉。


難哇,學?。?/p>

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁題目:【C語言】指針進階(1)-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://muchs.cn/article20/dcphjo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序搜索引擎優(yōu)化、關鍵詞優(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)

手機網(wǎng)站建設