国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

C語言指針篇(一篇文章讓你不再暈“針”)!!!

zsirfs / 1396人閱讀

摘要:指針的大小在位平臺(tái)是個(gè)字節(jié),在位平臺(tái)是個(gè)字節(jié)。比如的指針解引用就只能訪問一個(gè)字節(jié),而的指針的解引用就能訪問四個(gè)字節(jié)。所以是一個(gè)指針,指向一個(gè)數(shù)組,叫數(shù)組指針。

準(zhǔn)備

博主:大大怪先森(記得關(guān)注哦!)
編程環(huán)境:vs2013


提示:基于C語言所寫的關(guān)于指針的內(nèi)容,小白也能看懂!!!


前言

C語言指針的問題,是否是最讓我們頭暈眼花???
無限的套娃行為,成為我們懼怕c語言的首要障礙,各位小可愛不要擔(dān)心。
博主大大已經(jīng)為各位準(zhǔn)備好了學(xué)習(xí)過程中可能遇到的問題!讓我們一起揭開指針的全貌吧!!!!


提示:以下是本篇文章正文內(nèi)容,內(nèi)容原創(chuàng),版權(quán)必究!!!

一、指針是什么?

指針:
在計(jì)算機(jī)科學(xué)中,指針(Pointer)是編程語言中的一個(gè)對(duì)象,利用地址,它的值直接指向(points to)存在電腦存儲(chǔ)器中另一個(gè)地方的值。由于通過地址能找到所需的變量單元,可以說,地址指向該變量單元。因此,將地址形象化的稱為“指針”。意思是通過它能找到以它為地址的內(nèi)存單元

除此之外大多數(shù)的程序猿的理解即是:指針 = 地址
小結(jié):
指針是用來存放地址的,地址是唯一標(biāo)示一塊地址空間的。
指針的大小在32位平臺(tái)是4個(gè)字節(jié),在64位平臺(tái)是8個(gè)字節(jié)。

二、指針和指針類型

1.指針類型

我們都知道,變量有不同的類型,整形,浮點(diǎn)型等。那指針有沒有類型呢?
將&num(變量num的地址)保存到p指針中,我們知道p就是一個(gè)指針變量,那它的類型是怎樣的呢?

int main(){	int a = 0;	char ch = 0;	float p = 0.0f;	int* ptr = &a; //整形指針	char* ptr = &ch;//字符指針	float* ptc = &p;//單精度浮點(diǎn)數(shù)指針	//...	return 0;}

小結(jié):我們不難看出存放字符變量的地址就是字符指針,存放整形變量的地址的就是整形指針

2.指針類型的解引用

int main(){	int a = 10;	int*  pa = &a;	char* pc = &a;		printf("%p/n", pa);	printf("%p/n", pc);	printf("%p/n", pa+2);	printf("%p/n", pc+2);	//指針類型的意義2:	//指針類型決定了,指針+-整數(shù)的時(shí)候的步長(zhǎng)(指針+-整數(shù)的時(shí)候,跳過幾個(gè)字節(jié))	//int* 指針 +1 跳過4個(gè)字節(jié)	//char* 指針+1 跳過1個(gè)字節(jié)		//int a = 0x11223344;	//char* pc = &a;//int*	//*pc = 0;	//int*pa = &a;	//*pa = 0;	//指針類型的意義1:	//指針類型決定了指針解引用操作的時(shí)候,一次訪問幾個(gè)字節(jié)(訪問內(nèi)存的大小)	//char* 指針解引用訪問1個(gè)字節(jié)	//int* 指針解引用訪問4個(gè)字節(jié)	return 0;}

小結(jié):指針的類型決定了,對(duì)指針解引用的時(shí)候有多大的權(quán)限(能操作幾個(gè)字節(jié))。
比如: char* 的指針解引用就只能訪問一個(gè)字節(jié),而 int* 的指針的解引用就能訪問四個(gè)字節(jié)。

3.野指針

3.1.野指針的成因

  1. 指針未初始化
int main(){	int* p;//局部變量為初始化默認(rèn)為隨機(jī)值	*p = 20;	return 0;}
  1. .指針越界訪問
int main(){    int arr[10] = {0};    int *p = arr;    int i = 0;    for(i=0; i<=11; i++)   {        //當(dāng)指針指向的范圍超出數(shù)組arr的范圍時(shí),p就是野指針        *(p++) = i;   }    return 0; }

3.指針指向的空間內(nèi)存未釋放
詳細(xì)講解:請(qǐng)觀看博主大大的另一篇文章《動(dòng)態(tài)內(nèi)存管理》
為了防止小可愛們下次走丟了,趕緊…

3.2.如何規(guī)避野指針

我們到底應(yīng)該怎么規(guī)避這些問題?
各位小可愛在運(yùn)用指針的時(shí)候一定要注意一下幾點(diǎn)

  1. 指針初始化
  2. 小心指針越界
  3. 指針指向空間釋放即使置NULL
  4. 避免返回局部變量的地址
  5. 指針使用之前檢查有效性

所以說一個(gè)優(yōu)秀的程序猿代碼規(guī)范非常重要!!!!
在此給各位小可愛推薦一本書《高質(zhì)量的c/c++編程》,小編不是在此打廣告哦,

靜下心好好看一看,我相信各位小可愛一定會(huì)受益匪淺!!!

三、指針數(shù)組

指針數(shù)組是指針還是數(shù)組?
答案:是數(shù)組。是存放指針的數(shù)組。
數(shù)組我們已經(jīng)知道整形數(shù)組,字符數(shù)組。

int main(){	int a = 10;	int b = 20;	int c = 30;	int* arr[3] = {&a, &b, &c};	int i = 0;	for (i = 0; i < 3; i++)	{		printf("%d/n", *(arr[i]));	}	//int* pa = &a;	//int* pb = &b;	//int* pc = &c;	return 0;}

四、數(shù)組指針

1.數(shù)組指針的定義

數(shù)組指針是指針?還是數(shù)組?
答案是:指針。
我們已經(jīng)熟悉整形指針,浮點(diǎn)數(shù)指針,那么數(shù)組指針就是指向數(shù)組的指針

int* pa[10];int (*pb)[10];到底哪一個(gè)是數(shù)組指針呢?

答案是:int (*pb)[10]

解釋:pb先和*結(jié)合,說明pb是一個(gè)指針變量,然后指著指向的是一個(gè)大小為10個(gè)整型的數(shù)組。所以p是一個(gè)指針,指向一個(gè)數(shù)組,叫數(shù)組指針。這里要注意:[]的優(yōu)先級(jí)要高于星號(hào)*號(hào)的,所以必須加上()來保證pb先和*相結(jié)合

2.數(shù)組指針的使用

代碼如下(示例):

//void print1(int arr[], int sz)//{//	int i = 0;//	for (i = 0; i < sz; i++)//	{//		printf("%d ", arr[i]);//	}//}//void print2(int* arr, int sz)//{//	int i = 0;//	for (i = 0; i < sz; i++)//	{//		printf("%d ", *(arr + i));//	}//}//數(shù)組指針//void print3(int (*parr)[10], int sz)//這是一個(gè)錯(cuò)誤的示范//{//	int i = 0;//	for (i = 0; i < sz; i++)//	{//		printf("%d ", parr[i]);//parr[i] == *(parr+i)//	}//}void print4(int(*pa)[10], int sz){	int i = 0;	for (i = 0; i < sz - 1; i++)	{		//printf("%d ", *(pa + i));//錯(cuò)誤 		//printf("%d ", pa[i]);//erro		printf("%d ", (*pa)[i]);//*(pa +0)[i]  == pa[0][i] ==   *(*(pa) + i)		printf("%d ", pa[0][i]);		printf("%d ", *(*(pa)+i));		}}int main(){	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };		int sz = sizeof(arr) / sizeof(arr[0]);		print4(&arr, sz);		//print3(&arr, sz);		//print2(arr, sz);		//print1(arr, sz);//打印arr數(shù)組的內(nèi)容	return 0;}

學(xué)習(xí)了數(shù)組指針你是否對(duì)數(shù)值指針有更加深刻的理解了~~~
各位下可愛再看看下面的代碼的意思吧!

int arr[10];int* arr2[10];int (*pa)[10];int* (*pa[10])(10);

五、指針的傳參

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

思考如下代碼(示例):

#include    void test(int arr[])//ok?   {}   void test(int arr[10])//ok?   {}   void test(int *arr)//ok?   {}   void test2(int *arr[20])//ok?   {}   void test2(int **arr)//ok?   {}int main(){   int arr[10] = {0};   int *arr2[20] = {0};   test(arr);   test2(arr2);

1.× 2.√ 3.√ 4.× 5.√

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

代碼如下(示例):

void print2( int(*p)[5], int r, int c){	int i = 0;	for (i = 0; i < r; i++)	{		int j = 0;		for (j = 0; j < c; j++)		{			//printf("%d ", *(*(p + i) + 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 };	//二維數(shù)組傳參	//print1(arr, 3, 5);	print2(arr, 3, 5);//arr 是數(shù)組名,數(shù)組名是首元素地址	return 0;}

小結(jié):二維數(shù)組傳參arr是相當(dāng)于第一個(gè)行的數(shù)組名

其他接收參數(shù):int* arr or int** arr or int arr[3][5]

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

代碼如下(示例):

#include void print(int *p, int sz) {     int i = 0;    for(i=0; i<sz; i++)   {    printf("%d/n", *(p+i));   }}int main(){   int arr[10] = {1,2,3,4,5,6,7,8,9};   int *p = arr;   int sz = sizeof(arr)/sizeof(arr[0]);   //一級(jí)指針p,傳給函數(shù)    print(p, sz);   return 0; }

當(dāng)一個(gè)函數(shù)的參數(shù)部分為一級(jí)指針的時(shí)候,函數(shù)能接收什么參數(shù)?

in* p or in** pa or int arr[10];

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

void test(char **p) {}int main(){    char c = "b";    char*pc = &c;   char**ppc = &pc;   char* arr[10];   test(&pc);   test(ppc);   test(arr);//Ok?   return 0; }

六、函數(shù)指針

代碼如下(示例):

#include void test(){   printf("hehe/n");}int main(){   printf("%p/n", test);   printf("%p/n", &test);   return 0; }

輸出結(jié)果:

思考:兩者的地址相同,那如何吧地址存放在指針當(dāng)中?

答案:void (*fun)(int,int)

這就是所謂的函數(shù)指針 ,fun是變量名,void (*)(int,int)則是變量的類型,表示fun指向的函數(shù)的兩個(gè)參數(shù)分別都是int類型。

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

數(shù)組是一個(gè)存放相同類型數(shù)據(jù)的存儲(chǔ)空間,那我們已經(jīng)學(xué)習(xí)了指針數(shù)組,
比如:

int *arr[10];數(shù)組的每個(gè)元素是int*

那么那要把函數(shù)的地址存到一個(gè)數(shù)組中,那這個(gè)數(shù)組就叫函數(shù)指針數(shù)組,
那函數(shù)指針的數(shù)組如何定義呢?

int (*pa)(int,int)
int (*pa[10])(int,int)
[]的優(yōu)先級(jí)高于高于解引用的星號(hào)所以int (*pa[10])(int,int)的本質(zhì)上是一個(gè)數(shù)組,而每一個(gè)數(shù)組的元素存放的都是一個(gè)函數(shù)的地址即函數(shù)指針,每個(gè)函數(shù)指針?biāo)赶虻亩际呛袃蓚€(gè)int類型的參數(shù)

小練習(xí):使用函數(shù)指針數(shù)組實(shí)現(xiàn)的簡(jiǎn)易計(jì)算機(jī)

#include int add(int a, int b){	return a + b;}int sub(int a, int b){	return a - b;}int mul(int a, int b){	return a*b;}int div(int a, int b){	return a / b;}int main(){	int x, y;	int input = 1;	int ret = 0;	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //轉(zhuǎn)移表	while (input)	{		printf("*************************/n");		printf(" 1:add           2:sub /n");		printf(" 3:mul           4:div /n");		printf("*************************/n");		printf("請(qǐng)選擇:");		scanf("%d", &input);		if ((input <= 4 && input >= 1))		{			printf("輸入操作數(shù):");			scanf("%d %d", &x, &y);			ret = (*p[input])(x, y);		}		else			printf("輸入有誤/n");		printf("ret = %d/n", ret);	}	return 0;}

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

回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一
個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該
函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或
條件進(jìn)行響應(yīng)。
詳細(xì)了解:請(qǐng)關(guān)于博主的下一篇文章《指針和數(shù)組筆試題》


結(jié)語

希望本篇文章能給各位帶來幫助,如有不足還請(qǐng)指正!!!碼字不易,各位大大給個(gè)收藏點(diǎn)贊吧!!!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/121542.html

相關(guān)文章

  • C語言】超詳講解??是個(gè)什么?(次性搞定問題)

    目錄 前言 一、 什么是指針? 引例 計(jì)算機(jī)是怎么對(duì)內(nèi)存單元編號(hào)的呢? 內(nèi)存空間的地址如何得到 想存地址怎么辦? ? 本質(zhì)目的不是為了存地址 ?二、指針和指針類型 為什么有不同類型的指針 1.指針的解引用 2.指針+-整數(shù) 三、野指針 造成野指針的原因 1.未主動(dòng)初始化指針 ?2.指針越界訪問 3.指針指向的空間釋放 規(guī)避野指針 四、指針運(yùn)算 1.指針+-整數(shù) ?2.指針-指針 ?3.指針的關(guān)系運(yùn)...

    tigerZH 評(píng)論0 收藏0
  • C語言夠了(萬二千字,包含與數(shù)組,函數(shù)等詳解)

    摘要:指針變量可以存放基本類型數(shù)據(jù)的地址,也可以存放數(shù)組函數(shù)以及其他指針變量的地址。數(shù)組名表示的是整個(gè)數(shù)組所占的字節(jié)數(shù)。在這里數(shù)組指針的類型是。這也是我們可以用數(shù)組指針來接收二維數(shù)組數(shù)組名的原因。 目錄 零.前言 一.指針的定義 二.指針類型的意義 1.指針類型決定了指針解引用時(shí)一次訪問幾個(gè)字...

    My_Oh_My 評(píng)論0 收藏0
  • 五分鐘殺穿 pointer——C語言專題

    摘要:另外,通過指針可以更便捷地操作數(shù)組。在一定意義上可以說,指針是語言的精髓。野指針成因除了未初始化還有就是越界訪問或者指針指向空間已經(jīng)釋放。所以不難知道兩個(gè)地址相減就是元素的個(gè)數(shù),這個(gè)表達(dá)式的前提是兩個(gè)指針指向同一塊空間。 ...

    MycLambert 評(píng)論0 收藏0
  • 21_09_25 C語言雜談

    摘要:多維數(shù)組本質(zhì)上和一維數(shù)組沒區(qū)別,他的維數(shù)僅僅只是作為比例因子和偏移,拿來計(jì)算地址偏移用的,但是多級(jí)指針用數(shù)組訪問的時(shí)候,他的維數(shù)僅僅只做偏移用,他的過程是加偏移,解引用,加偏移,解引用。。。。 類型 c語言中規(guī)定類型這樣一個(gè)事情,主要是出于一個(gè)怎樣的原因呢? char sho...

    JerryZou 評(píng)論0 收藏0
  • 【硬核】用C語言來寫學(xué)生成績(jī)管理系統(tǒng),讓你的課設(shè)不再是難題

    摘要:嗨這里是狐貍大家的期末課設(shè)要來了吧,有想法做什么了嘛,有沒有為此熬夜,有沒有為此努力呢,今天,我們來寫一個(gè)學(xué)生成績(jī)管理系統(tǒng),一方面是讓大家復(fù)習(xí)一下自己學(xué)過的知識(shí),一方面是為了給大家的期末課設(shè)提供一點(diǎn)思路。 目錄 序 嗨!這里是狐貍~~ 一、需求分析說明 二、概要設(shè)計(jì)說明 三、詳細(xì)設(shè)計(jì)說明 1...

    seanHai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<