最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言學(xué)習(xí)之指針的使用詳解

 更新時(shí)間:2022年10月27日 10:11:04   作者:蝸牛牛啊  
想突破C語(yǔ)言的學(xué)習(xí),對(duì)指針的掌握是非常重要的,本文為大家總結(jié)了C語(yǔ)言中指針的相關(guān)知識(shí)點(diǎn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下

一、指針概念

在學(xué)習(xí)指針之前我們先要了解一下內(nèi)存,內(nèi)存是存儲(chǔ)區(qū)域,我們可以把內(nèi)存劃分成一個(gè)一個(gè)的內(nèi)存單元,最小的內(nèi)存單元是字節(jié)

計(jì)算機(jī)將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,而為了能夠快速查找到所需數(shù)據(jù),計(jì)算機(jī)會(huì)將內(nèi)存進(jìn)行編號(hào),通過(guò)查找編號(hào),可以快速查找到數(shù)據(jù)。指針是內(nèi)存中一個(gè)最小單元的編號(hào),內(nèi)存單元的編號(hào)也被稱(chēng)為地址,指針就是地址。

平時(shí)我們說(shuō)的指針通常指的是指針變量,是用來(lái)存放內(nèi)存地址的變量

1個(gè)字節(jié)(byte)=8個(gè)bit(bit即比特位,由0和1組成)

在32位的機(jī)器上(X86環(huán)境),地址是32個(gè)0或者1組成二進(jìn)制序列,那地址就得用4個(gè)字節(jié)的空間來(lái)存儲(chǔ),所以一個(gè)指針變量的大小就應(yīng)該是4個(gè)字節(jié)。在64位的機(jī)器上(X64環(huán)境),地址是64個(gè)0或者1組成二進(jìn)制序列,那地址就得用8個(gè)字節(jié)的空間來(lái)存儲(chǔ),所以一個(gè)指針變量的大小是8個(gè)字節(jié)。

無(wú)論何種數(shù)據(jù)類(lèi)型的指針,指針的大小在32位(X86環(huán)境)平臺(tái)下是4個(gè)字節(jié),在64位(X64環(huán)境)平臺(tái)下是8個(gè)字節(jié)。

1.指針變量

我們可以通過(guò)&(取地址操作符)取出變量的內(nèi)存起始地址,把地址可以存放到一個(gè)變量中,這個(gè)變量就是指針變量。

*(解引用操作符又叫間接訪(fǎng)問(wèn)操作符):對(duì)指針變量進(jìn)行解引用操作,通過(guò)指針變量里面的地址找到指向的內(nèi)容。

#include <stdio.h>
int main()
{
	int  a = 20;
	char ch;
	int* pa = &a;//a向內(nèi)存申請(qǐng)了4個(gè)字節(jié)的空間,所以&a的時(shí)候應(yīng)該拿出第1個(gè)字節(jié)的地址
	//拿出a的第1個(gè)字節(jié)的地址放在整型指針變量pa里
	char* pc = &ch;//拿出ch的地址放在字符指針變量pc里
	printf("%p\n",&a);//%p打印的是地址
	//printf("%p\n",pa);打印出來(lái)的地址和&a打印出來(lái)的一樣
	printf("%p\n",&ch);
	return 0;
}

指針變量是用來(lái)存放地址的變量,存放在指針變量中的值都被當(dāng)成地址處理,同時(shí)地址是唯一標(biāo)識(shí)一個(gè)內(nèi)存單元的

2.指針類(lèi)型

指針的類(lèi)型根據(jù)你所需要的數(shù)據(jù)類(lèi)型進(jìn)行使用,如

  • //char* pc;指針類(lèi)型是char*
  • // char** pcc;指針類(lèi)型是char**
  • //int* pa;指針類(lèi)型是int*
  • // double* pd;指針類(lèi)型是double*
  • // …

但是要注意區(qū)分指針指向的類(lèi)型和指針類(lèi)型之間的區(qū)別

  • // char* pc;其中* 指pc是指針,指向的類(lèi)型是char
  • // char** pcc;其中* 指pcc是指針,指向的類(lèi)型是char*
  • // int* pa;* 指pa是指針,指向的類(lèi)型是int
  • // double* pd;* 指pd是指針,指針指向的類(lèi)型是double
  • // …

指針類(lèi)型決定了指針進(jìn)行解引用操作時(shí)訪(fǎng)問(wèn)幾個(gè)字節(jié)

char* 類(lèi)型的指針解引用訪(fǎng)問(wèn)1個(gè)字節(jié);

int* 類(lèi)型的指針解引用訪(fǎng)問(wèn)4個(gè)字節(jié);

double* 類(lèi)型的指針解引用訪(fǎng)問(wèn)8個(gè)字節(jié);

例1:

#include <stdio.h>
int main()
{
	int a = 0x11223344;//用16進(jìn)制表示
	int* pa = &a;
	*pa = 0;
	return 0;
}

上述代碼在VS(小端存儲(chǔ))調(diào)試過(guò)程中,&a在內(nèi)存中顯示的是

執(zhí)行完*pa=0;后,&a在內(nèi)存中變?yōu)?/p>

將例1中的指針類(lèi)型改為char* 類(lèi)型,用char* 類(lèi)型的指針接收a的地址

int* 和 char*類(lèi)型的指針都能將int類(lèi)型的a存放,因?yàn)樵?2位平臺(tái)下,指針類(lèi)型的大小都是4個(gè)字節(jié)。

#include <stdio.h>
int main()
{
	int a = 0x11223344;//用16進(jìn)制表示
	char* pc = &a;
	*pc = 0;
	return 0;
}

上述代碼在VS(小端存儲(chǔ))調(diào)試過(guò)程中,&a在內(nèi)存中顯示的是

執(zhí)行完*pc=0;語(yǔ)句后,內(nèi)存變化為

通過(guò)上述兩個(gè)代碼塊執(zhí)行后內(nèi)存中的變化可以驗(yàn)證指針類(lèi)型決定了指針進(jìn)行解引用操作時(shí)訪(fǎng)問(wèn)幾個(gè)字節(jié)

指針類(lèi)型決定了指針的步長(zhǎng),指針加減整數(shù)的時(shí)候向前或者向后走一步走多大距離

(char*)+1------跳過(guò)一個(gè)char類(lèi)型的大小,也就是向后走1個(gè)字節(jié);

(int*)+1------跳過(guò)一個(gè)int類(lèi)型的大小,也就是向后走4個(gè)字節(jié);

(double*)+1------跳過(guò)一個(gè)double類(lèi)型的大小,也就是向后走8個(gè)字節(jié);

#include <stdio.h>
int main()
{
	int a = 0x11223344;
	int* pa = &a;
	char* pc = &a;
	printf("%p\n",pa);
	printf("%p\n",pc);
	printf("%p\n",pa+1);
	printf("%p\n",pc+1);
	return 0;
}

上述代碼的運(yùn)行結(jié)果為

說(shuō)明指針加減整數(shù)時(shí)的步長(zhǎng)和指針指向的類(lèi)型有關(guān)

練習(xí)1:

我們可以通過(guò)一個(gè)練習(xí)對(duì)其有更好的理解:將數(shù)組arr中每個(gè)元素賦值為對(duì)應(yīng)下標(biāo),arr[0]為0;arr[1]為1……

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = arr;//p指向arr數(shù)組的首元素地址
	int i = 0;
	for(i = 0;i < 10; i++)
	{ 
		*(p++) = i;//將數(shù)組元素賦值;
		//后置++,對(duì)p進(jìn)行解引用,賦值之后,再向后走int類(lèi)型的大小,即4個(gè)字節(jié),依次循環(huán)
	}
	for(i = 0;i < 10; i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

運(yùn)行結(jié)果如圖

3.二級(jí)指針

#include <stdio.h>
int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;//pp就是二級(jí)指針
	*p = 20;//可以將a修改成20
	**pp = 30;//可以將a修改成30
	printf("%d\n",a);
	return 0;
}

二、野指針

野指針就是指針指向的位置是不可知的,(隨機(jī)的、不正確的、沒(méi)有明確限制的)

1.野指針成因

1.指針未初始化

#include <stdio.h>
int main()
{
	int* p;//p沒(méi)有初始化,p就是野指針
	*p = 20;//賦值
	return 0;
}

2.指針越界訪(fǎng)問(wèn)

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr)/sizeof(arr[0]);//計(jì)算arr數(shù)組中元素個(gè)數(shù)
	int* p = arr;
	for(i = 0;i <= sz; i++)//共循環(huán)11次
	{
		*p++ = i;
	}
	return 0;
}

當(dāng)p越過(guò)arr已有空間去越界訪(fǎng)問(wèn)的時(shí)候就是野指針了,之前不是野指針。

當(dāng)指針指向的范圍超出數(shù)組arr的范圍時(shí),p就是野指針

3.指針指向的空間釋放

#include <stdio.h>
int* test()
{
	int num = 100;//num是局部變量,進(jìn)函數(shù)創(chuàng)建,函數(shù)結(jié)束時(shí)銷(xiāo)毀
	return &num;//返回的是??臻g的地址
}
int main()
{
	int* p = test();//接收到地址,但是地址并不指向num,不知道指向的是哪里,所以*p = 200并不知道修改的是哪里
	//雖然接收到地址,但是num已經(jīng)銷(xiāo)毀
	*p = 200;
	return 0;
}

2.規(guī)避野指針

1.指針初始化

#include <stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;//明確指針
	int* pa = NULL;//當(dāng)pa不知道指向哪里時(shí),置空
	//NULL就是用來(lái)初始化指針的
	//*pa = 20;//error,在對(duì)指針置空之后不能這樣使用,NULL屬于系統(tǒng)(內(nèi)核),不能訪(fǎng)問(wèn)
	return 0;
}

2.小心指針越界問(wèn)題

3.指針指向空間釋放,及時(shí)置NULL;

#include <stdio.h>
#include <stdlib.h>//malloc的頭文件
int main()
{
	//動(dòng)態(tài)申請(qǐng)內(nèi)存空間
	int* p=(int*)malloc(40);
	//使用
	//釋放
	free(p);
	p=NULL;
	return 0;
}

4.避免返回局部變量的地址,即避免返回棧空間的地址,這樣可以盡量避免指針指向的空間釋放這種情況。

5.指針使用之前檢查有效性

三、指針運(yùn)算

1.指針±整數(shù)

指針±整數(shù)是根據(jù)指針指向的數(shù)據(jù)類(lèi)型大小向前或者向后走多少個(gè)字節(jié)。

  • //char* pc;pc+1就是向后走一個(gè)char類(lèi)型大小的字節(jié);
  • //int* pa;pa+1就是向后走一個(gè)int類(lèi)型大小的字節(jié);
  • //double* pd;pd+1就是向后走一個(gè)double類(lèi)型大小的字節(jié);
  • //……

在練習(xí)1中已經(jīng)對(duì)其用法進(jìn)行簡(jiǎn)單演示。

2.指針-指針

兩個(gè)指針相減的前提是:指針指向的是同一塊連續(xù)的空間,且是同一種類(lèi)型的指針。

指針和指針相減的絕對(duì)值是指針之間的元素個(gè)數(shù)

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%d\n",&arr[9]-&arr[0]);//9
	printf("%d\n",&arr[9]-&arr[0]);//-9
	return 0;
}

練習(xí)2:

模擬實(shí)現(xiàn)strlen,strlen函數(shù)在對(duì)字符串中的字符進(jìn)行統(tǒng)計(jì)時(shí),遇見(jiàn)’\0’停止。

#include <stdio.h>
int my_strlen(const char* arr)
{
	const char* start = arr;//將arr數(shù)組首元素地址賦給start
	const char* end = arr;
	while(*end)
	{
		end++;
	}
	return end-start;
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d",len);//6
	return 0;
}

3.指針關(guān)系運(yùn)算

#include <stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 0 };
	int* p = &arr[10];
	for(p = &arr[10];p > &arr[0])
	{
		*--p = 0;//先將p向前移動(dòng)4個(gè)字節(jié),再對(duì)p賦值;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);// 全為0
	}
	return 0;
}

指針關(guān)系運(yùn)算的標(biāo)準(zhǔn)規(guī)定:允許指向數(shù)組元素的指針與指向數(shù)組最后一個(gè)元素后面的那個(gè)內(nèi)存位置的指針比較,但是不允許指向數(shù)組元素的指針與指向數(shù)組第一個(gè)元素前面的那個(gè)內(nèi)存位置的指針進(jìn)行比較。

四、指針數(shù)組

1.指針和數(shù)組

指針和數(shù)組不是一個(gè)東西,指針是一個(gè)變量,是用來(lái)存放地址的,4/8個(gè)字節(jié);數(shù)組能夠存放一組數(shù),是一個(gè)連續(xù)的空間,數(shù)組的大小取決于元素個(gè)數(shù)。

聯(lián)系:數(shù)組名就是地址(指針);數(shù)組把首元素的地址交給一個(gè)指針變量之后,可以通過(guò)指針來(lái)訪(fǎng)問(wèn)數(shù)組。

2.指針數(shù)組的概念

//char arr[n]——字符數(shù)組:存放字符的數(shù)組

//int arr[n]——整型數(shù)組:存放整型的數(shù)組

指針數(shù)組:存放指針的數(shù)組

//char* arr[n]——字符指針數(shù)組:存放字符指針的數(shù)組

//int* arr[n]——整型指針數(shù)組:存放整型指針的數(shù)組

練習(xí)3:

通過(guò)指針數(shù)組打印a,b,c,d的值

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int d = 40;
	int* arr[4] = {&a,&b,&c,&d};
	for(i = 0;i < 4;i++)
	{
		printf("%d  ",*(arr[i]));
	}
	return 0;
}

運(yùn)行結(jié)果為

練習(xí)4:

用一維數(shù)組模擬二維數(shù)組,打印出各個(gè)數(shù)組的值

#include <stdio.h>
int main()
{
	int arr1[4] = {1,2,3,4};
	int arr2[4] = {2,3,4,5};
	int* arr[2] = {arr1, arr2};//指針數(shù)組中存放的是每個(gè)數(shù)組中首元素的地址
	int i = 0;
	for(i = 0;i < 2;i++)
	{
		int j = 0;
		for(j = 0;j < 4;j++)
		{
			printf("%d  ",arr[i][j]);
			//arr[i][j]還可以寫(xiě)為*(arr[i]+j)或者*(*(arr+i)+j);arr是數(shù)組首元素的地址
		}
		printf("\n");
	} 
	return 0;
}

運(yùn)行結(jié)果為

練習(xí)5:

用指針數(shù)組打印字符串

#include <stdio.h>
int main()
{
	char* arr[4] = {"abc","bcd","cde","def"};//常量字符串
	//arr中存放的是每個(gè)字符串中首個(gè)字符的地址
	int i = 0;
	for(i = 0;i < 4;i++)
	{
		printf("%s\n",arr[i]);//%s打印字符串,只要有字符串起始地址就可以打印
	}
	return 0;
}

運(yùn)行結(jié)果為

五、字符指針

在指針的類(lèi)型中,我們知道有一種指針類(lèi)型叫字符指針char*。

#include <stdio.h>
int main()
{
	char* pc = "abcdef";
	printf("%s\n", pc);//abcdef
	printf("%c", *pc);//a
	return 0;
}

字符指針可以存放字符串的起始地址,把字符串首元素的地址存在pc中,但這種做法不合理;"abcdef"是常量字符串,不能修改,這時(shí)讓"*pc = 'w'"程序會(huì)崩,可以將char* pc = "abcdef"修改為const char* pc = "abcdef",const放在* 的左邊,限制*pc,不能改變字符串內(nèi)容。

練習(xí)6:

判斷下列代碼的輸出內(nèi)容;

#include <stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	const char* arr3 = "abcdef";
	const char* arr4 = "abcdef";
	if(arr1 == arr2)//數(shù)組名表示數(shù)組首元素的地址,比較地址是否相同
		printf("arr1 and arr2 are same\n");
	else
		printf("arr1 and arr2 are not same\n");
	if(arr3 == arr4)
		printf("arr3 and arr4 are same\n");
	else
		printf("arr3 and arr4 are not same\n");
	return 0;
}

輸出結(jié)果為

if(arr1 == arr2)if(arr3 == arr4)比較的是他們的首元素地址是否相同。

數(shù)組名是數(shù)組首元素的地址,arr1和arr2是數(shù)組,他們的首元素地址不同,所以他們不相同。

而arr3和arr4是char*類(lèi)型的指針,他們指向的是常量字符串,常量字符串在內(nèi)存中只保存一份,地址相同,所以arr3和arr4指向的都是a的地址。

六、數(shù)組指針

//char* pc——字符指針-指向字符的指針,存放字符變量的地址

//int* pa ——整型指針-指向整型的指針,存放整型變量的地址

//int(*p)[n]——數(shù)組指針-指向數(shù)組的指針,存放數(shù)組的地址,p是數(shù)組指針變量

數(shù)組指針在一維數(shù)組里面的應(yīng)用

void print(int(*p)[5])
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", (*p)[i]);
	}
}
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	print(&arr);//&arr取的是整個(gè)數(shù)組的地址
	return 0;
}

運(yùn)行結(jié)果為

注意是數(shù)組指針也是指針,p應(yīng)該先與 * 結(jié)合,再與[ ]結(jié)合, (*p)要用( )括起來(lái)

數(shù)組指針很少在一維數(shù)組中應(yīng)用,一般在二維數(shù)組中應(yīng)用

void print(int(*p)[5], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%d ", *( * (p + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	print(&arr, 3, 5);
	return 0;
}

運(yùn)行結(jié)果

數(shù)組名相當(dāng)于數(shù)組首元素的地址,對(duì)于二維數(shù)組來(lái)說(shuō),首元素理解為他的第0行,p里面存的是第0行的地址,p是數(shù)組指針類(lèi)型,p+1相當(dāng)于向后走了5個(gè)int類(lèi)型的大小,p+1指向第1行,(p+i)指向的就是第i行的地址。* (p+i) 相當(dāng)于第i行的數(shù)組名; * (p+i)=p[i]。

擴(kuò)展:int(*p[10])[5]——p是數(shù)組,有10個(gè)元素,每個(gè)元素都是數(shù)組指針,每個(gè)數(shù)組指針指向一個(gè)具有5個(gè)int類(lèi)型的數(shù)組的地址。我們可以說(shuō)p是存放數(shù)組指針的數(shù)組。

七、數(shù)組傳參和指針傳參

1.一維數(shù)組傳參

數(shù)組傳參,形參可以是數(shù)組,也可以是指針。

int arr[10] = {0}傳參,他的參數(shù)用數(shù)組接收可以是int arr[]或者int arr[10];用指針接收是int* arr。

int* arr[10] = {0}傳參,他的參數(shù)用數(shù)組接收是int* arr[10],用指針接收是int** arr。

2.二維數(shù)組傳參

int arr[3][5]傳參,他的參數(shù)用數(shù)組接收是int arr[3][5]或者int arr[][5],用指針接收int (*arr)[5]。

3.一級(jí)指針傳參

int* p傳參,參數(shù)部分直接寫(xiě)成指針形式:int* p。

4.二級(jí)指針傳參

int** p傳參,參數(shù)部分直接寫(xiě)成指針形式:int** p

八、函數(shù)指針

#include <stdio.h>
int Add(int x,int y)
{
	return x+y;
}
int main()
{
	int a = 10;
	int b = 20;
	int(*pf)(int,int)=Add;
	//int(*pf)(int,int)中,int是函數(shù)返回類(lèi)型,pf是函數(shù)指針變量,(int,int)是函數(shù)的參數(shù)類(lèi)型
	//int ret = Add(a,b);
	int ret = (*pf)(a,b);//輸出結(jié)果是30
	//使用函數(shù)指針時(shí),也可以省略*
	//int ret = pf(a,b);
	printf("%d",ret);
	return 0;
}

九、函數(shù)指針數(shù)組

函數(shù)指針數(shù)組:可以存放多個(gè)返回類(lèi)型相同和參數(shù)相同的函數(shù)的地址。

我們通過(guò)構(gòu)造一個(gè)簡(jiǎn)單的計(jì)算器來(lái)實(shí)現(xiàn)對(duì)函數(shù)指針數(shù)組的應(yīng)用

void menu()
{
	printf("******************\n");
	printf("**1.Add    2.Sub**\n");
	printf("**3.Mul    4.Div**\n");
	printf("**0.exit        **\n");
	printf("******************\n");
}
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;
}
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	int(*pf[5])(int, int) = { 0,Add,Sub,Mul,Div };//利用數(shù)組下標(biāo)引用函數(shù)
	do
	{
		menu();
		printf("請(qǐng)選擇>:");
		scanf("%d", &input);
		if (input == 0)//input為0時(shí),直接退出計(jì)算器
		{
			printf("退出計(jì)算器\n");
			break;
		}
		if (input >= 1 && input <= 4)//判斷input是否符合要求
		{
			printf("請(qǐng)輸入兩個(gè)操作數(shù):");
			scanf("%d%d", &x, &y);
			ret = (*pf[input])(x, y);
			printf("結(jié)果為%d\n", ret);
		}
		else
		{
			printf("選擇錯(cuò)誤\n");//input不符合要求,給與提示
		}
	} while (input);
	return 0;
}

擴(kuò)展:指向函數(shù)指針數(shù)組的指針int(*(*pf)[5])(int,int)=&pf。

十、回調(diào)函數(shù)

回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。簡(jiǎn)言之,我們拿到一個(gè)函數(shù),通過(guò)函數(shù)的地址調(diào)用一個(gè)函數(shù),被調(diào)用的函數(shù)就被稱(chēng)為回調(diào)函數(shù)。

我們通過(guò)對(duì)上面那個(gè)計(jì)算器進(jìn)行改寫(xiě),從而讓我們能夠更好的理解回調(diào)函數(shù)。

void menu()
{
	printf("******************\n");
	printf("**1.Add    2.Sub**\n");
	printf("**3.Mul    4.Div**\n");
	printf("**0.exit        **\n");
	printf("******************\n");
}
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 calc(int(*p)(int, int))
{
	int x = 0;
	int y = 0;
	printf("請(qǐng)輸入兩個(gè)操作數(shù):");
	scanf("%d%d", &x, &y);
	printf("%d\n", (*p)(x,y));
}
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	int(*pf[5])(int, int) = { 0,Add,Sub,Mul,Div };
	do
	{
		menu();
		printf("請(qǐng)選擇>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			calc(Add);
			break;
		case 2:
			calc(Sub);
			break;
		case 3:
			calc(Mul);
			break;
		case 4:
			calc(Div);
			break;
		case 0:
			printf("EXIT");
		}
	} while (input);
	return 0;
}

把函數(shù)地址傳給一個(gè)函數(shù)calc,在calc函數(shù)內(nèi)部通過(guò)函數(shù)指針p調(diào)用Add時(shí),Add就被稱(chēng)為回調(diào)函數(shù)。

以上就是C語(yǔ)言學(xué)習(xí)之指針的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言指針的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言中操作sqlserver數(shù)據(jù)庫(kù)案例教程

    C語(yǔ)言中操作sqlserver數(shù)據(jù)庫(kù)案例教程

    這篇文章主要介紹了C語(yǔ)言中操作sqlserver數(shù)據(jù)庫(kù)案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Matlab中圖像數(shù)字水印算法的原理與實(shí)現(xiàn)詳解

    Matlab中圖像數(shù)字水印算法的原理與實(shí)現(xiàn)詳解

    數(shù)字水印技術(shù)作為信息隱藏技術(shù)的一個(gè)重要分支,是將信息(水印)隱藏于數(shù)字圖像、視頻、音頻及文本文檔等數(shù)字媒體中,從而實(shí)現(xiàn)隱秘傳輸、存儲(chǔ)、標(biāo)注、身份識(shí)別、版權(quán)保護(hù)和防篡改等目的。本文就來(lái)講講圖像數(shù)字水印算法的原理與實(shí)現(xiàn),感興趣的可以了解一下
    2023-04-04
  • C++ 系統(tǒng)String類(lèi)詳解

    C++ 系統(tǒng)String類(lèi)詳解

    這篇文章主要介紹了C++的系統(tǒng)String類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • 詳解C++中vector的理解以及模擬實(shí)現(xiàn)

    詳解C++中vector的理解以及模擬實(shí)現(xiàn)

    vector是表示可變大小數(shù)組的序列容器。這篇文章主要為大家詳細(xì)介紹了vector的理解以及模擬實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-03-03
  • 詳解如何利用C++實(shí)現(xiàn)一個(gè)反射類(lèi)

    詳解如何利用C++實(shí)現(xiàn)一個(gè)反射類(lèi)

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)反射類(lèi),文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • 詳解C++中const_cast與reinterpret_cast運(yùn)算符的用法

    詳解C++中const_cast與reinterpret_cast運(yùn)算符的用法

    這篇文章主要介紹了C++中const_cast與reinterpret_cast運(yùn)算符的用法,經(jīng)常被用于表達(dá)式中的類(lèi)型轉(zhuǎn)換,需要的朋友可以參考下
    2016-01-01
  • C++實(shí)現(xiàn)調(diào)用系統(tǒng)時(shí)間簡(jiǎn)單示例

    C++實(shí)現(xiàn)調(diào)用系統(tǒng)時(shí)間簡(jiǎn)單示例

    這篇文章主要介紹了C++實(shí)現(xiàn)調(diào)用系統(tǒng)時(shí)間,需要的朋友可以參考下
    2014-07-07
  • OpenCV實(shí)現(xiàn)簡(jiǎn)單錄屏功能

    OpenCV實(shí)現(xiàn)簡(jiǎn)單錄屏功能

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)簡(jiǎn)單錄屏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例

    C語(yǔ)言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例

    本文主要介紹C語(yǔ)言 結(jié)構(gòu)體和指針,這里整理了相關(guān)資料,并附示例代碼和實(shí)現(xiàn)結(jié)果,以便大家學(xué)習(xí)參考,希望能幫助學(xué)習(xí)C語(yǔ)言的朋友
    2016-08-08
  • 淺談c++性能測(cè)試工具google benchmark

    淺談c++性能測(cè)試工具google benchmark

    本文將會(huì)介紹如何使用模板以及參數(shù)生成器來(lái)批量生成測(cè)試用例,簡(jiǎn)化繁瑣的性能測(cè)試代碼
    2021-06-06

最新評(píng)論

英超| 商都县| 蚌埠市| 柳州市| 合江县| 盘山县| 武冈市| 碌曲县| 潼南县| 内乡县| 姜堰市| 萨嘎县| 中西区| 谢通门县| 保德县| 漾濞| 章丘市| 榆林市| 牙克石市| 延安市| 姜堰市| 温宿县| 乌海市| 格尔木市| 湖州市| 汉沽区| 广东省| 班戈县| 娱乐| 昌吉市| 长白| 盱眙县| 赤峰市| 房山区| 宁明县| 双牌县| 虹口区| 泾源县| 南昌县| 华池县| 南京市|