摘要:指針的大小在位平臺(tái)是個(gè)字節(jié),在位平臺(tái)是個(gè)字節(jié)。比如的指針解引用就只能訪問一個(gè)字節(jié),而的指針的解引用就能訪問四個(gè)字節(jié)。所以是一個(gè)指針,指向一個(gè)數(shù)組,叫數(shù)組指針。
博主:大大怪先森(記得關(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é)。
我們都知道,變量有不同的類型,整形,浮點(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é):我們不難看出存放字符變量的地址就是字符指針,存放整形變量的地址的就是整形指針
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é)。
int main(){ int* p;//局部變量為初始化默認(rèn)為隨機(jī)值 *p = 20; return 0;}
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)存管理》
為了防止小可愛們下次走丟了,趕緊…
我們到底應(yīng)該怎么規(guī)避這些問題?
各位小可愛在運(yùn)用指針的時(shí)候一定要注意一下幾點(diǎn)
所以說一個(gè)優(yōu)秀的程序猿代碼規(guī)范非常重要!!!!
在此給各位小可愛推薦一本書《高質(zhì)量的c/c++編程》,小編不是在此打廣告哦,
靜下心好好看一看,我相信各位小可愛一定會(huì)受益匪淺!!!
指針數(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ù)組指針是指針?還是數(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é)合
代碼如下(示例):
//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);
思考如下代碼(示例):
#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.√
代碼如下(示例):
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]
代碼如下(示例):
#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];
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; }
√
代碼如下(示例):
#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ù)組是一個(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ù)就是一個(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ù)組筆試題》
希望本篇文章能給各位帶來幫助,如有不足還請(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
目錄 前言 一、 什么是指針? 引例 計(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)...
摘要:指針變量可以存放基本類型數(shù)據(jù)的地址,也可以存放數(shù)組函數(shù)以及其他指針變量的地址。數(shù)組名表示的是整個(gè)數(shù)組所占的字節(jié)數(shù)。在這里數(shù)組指針的類型是。這也是我們可以用數(shù)組指針來接收二維數(shù)組數(shù)組名的原因。 目錄 零.前言 一.指針的定義 二.指針類型的意義 1.指針類型決定了指針解引用時(shí)一次訪問幾個(gè)字...
摘要:另外,通過指針可以更便捷地操作數(shù)組。在一定意義上可以說,指針是語言的精髓。野指針成因除了未初始化還有就是越界訪問或者指針指向空間已經(jīng)釋放。所以不難知道兩個(gè)地址相減就是元素的個(gè)數(shù),這個(gè)表達(dá)式的前提是兩個(gè)指針指向同一塊空間。 ...
摘要:多維數(shù)組本質(zhì)上和一維數(shù)組沒區(qū)別,他的維數(shù)僅僅只是作為比例因子和偏移,拿來計(jì)算地址偏移用的,但是多級(jí)指針用數(shù)組訪問的時(shí)候,他的維數(shù)僅僅只做偏移用,他的過程是加偏移,解引用,加偏移,解引用。。。。 類型 c語言中規(guī)定類型這樣一個(gè)事情,主要是出于一個(gè)怎樣的原因呢? char sho...
摘要:嗨這里是狐貍大家的期末課設(shè)要來了吧,有想法做什么了嘛,有沒有為此熬夜,有沒有為此努力呢,今天,我們來寫一個(gè)學(xué)生成績(jī)管理系統(tǒng),一方面是讓大家復(fù)習(xí)一下自己學(xué)過的知識(shí),一方面是為了給大家的期末課設(shè)提供一點(diǎn)思路。 目錄 序 嗨!這里是狐貍~~ 一、需求分析說明 二、概要設(shè)計(jì)說明 三、詳細(xì)設(shè)計(jì)說明 1...
閱讀 3826·2021-11-25 09:43
閱讀 2170·2021-11-23 10:11
閱讀 1397·2021-09-29 09:35
閱讀 1309·2021-09-24 10:31
閱讀 2035·2019-08-30 15:48
閱讀 2353·2019-08-29 15:28
閱讀 425·2019-08-29 12:36
閱讀 3490·2019-08-28 18:12