色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 嵌入式指針數(shù)組

嵌入式指針數(shù)組 時(shí)間:2018-09-29      來源:未知

題目:指針數(shù)組,數(shù)組指針,指針函數(shù)及函數(shù)指針相關(guān)的辨析

首先我們要明確:

“指針數(shù)組”是數(shù)組,“數(shù)組指針”是指針。指針數(shù)組的每個(gè)數(shù)組元素都是一個(gè)指針,而數(shù)組指針是指向一個(gè)數(shù)組的指針。

“指針函數(shù)”與“函數(shù)指針”容易搞錯(cuò),簡(jiǎn)單的辨別方式就是看函數(shù)名前面的指針*號(hào)有沒有被括號(hào)()包含,如果被包含就是函數(shù)指針,反之則是指針函數(shù)。指針函數(shù)本質(zhì)是一個(gè)函數(shù),函數(shù)返回類型是某一類型的指針。函數(shù)指針則是一個(gè)指針,指向聲明中規(guī)定的返回值和參數(shù)類型及個(gè)數(shù)嚴(yán)格一致的函數(shù)。

指針數(shù)組:

在我們講解指針數(shù)組的概念之前,先讓我們來看一個(gè)實(shí)例,它用到了一個(gè)由 3 個(gè)整數(shù)組成的數(shù)組:

實(shí)例

#include

const int MAX = 3;

int main ()

{

int var[] = {1,2,3};

int i;

for (i = 0; i < MAX; i++)

{

printf("Value of var[%d] = %d\n", i, var[i] );

}

return 0;

}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Value of var[0] = 1

Value of var[1] = 2

Value of var[2] = 3

可能有時(shí)我們想要讓數(shù)組存儲(chǔ)指向 int或 char 或其他數(shù)據(jù)類型的指針。下面是一個(gè)指向整數(shù)的指針數(shù)組的聲明:

int *ptr[MAX];

在這里,把 ptr 聲明為一個(gè)數(shù)組,由 MAX 個(gè)整數(shù)指針組成。因此,ptr 中的每個(gè)元素,都是一個(gè)指向 int 值的指針。下面的實(shí)例用到了三個(gè)整數(shù),它們將存儲(chǔ)在一個(gè)指針數(shù)組中,如下所示:

#include

const int MAX = 3;

int main ()

{

int var[] = {1, 2, 3};

int i, *ptr[MAX];

for ( i = 0; i < MAX; i++)

{

ptr[i] = &var[i]; /* 賦值為整數(shù)的地址 */

}

for ( i = 0; i < MAX; i++)

{

printf("Value of var[%d] = %d\n", i, *ptr[i] );

}

return 0;

}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Value of var[0] = 1

Value of var[1] = 2

Value of var[2] = 3

您也可以用一個(gè)指向字符的指針數(shù)組來存儲(chǔ)一個(gè)字符串列表,如下:

實(shí)例

#include

const int MAX = 4;

int main ()

{

char *names[] = {

"hello!",

"we",

"are",

"changke",

};

int i = 0;

for ( i = 0; i < MAX; i++)

{

printf("Value of names[%d] = %s\n", i, names[i] );

}

return 0;

}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Value of names[0] = hello!

Value of names[1] = we

Value of names[2] = are

Value of names[3] = changke

數(shù)組指針:

定義如下的指針變量:

int (*p)[3];

指針p為指向一個(gè)由3個(gè)元素所組成的整型數(shù)組指針。在定義中, 圓括號(hào)是不能少的, 否則它是指針數(shù)組, 這將在后面介紹。這種數(shù)組的指針不同于前面介紹的整型指針, 當(dāng)整型指針指向一個(gè)整型數(shù)組的元素時(shí), 進(jìn)行指針(地址)加1運(yùn)算, 表示指向數(shù)組的下一個(gè)元素, 此時(shí)地址值增加了4(因?yàn)榉糯笠蜃訛?), 而如上所定義的指向一個(gè)由3個(gè)元素組成的數(shù)組指針, 進(jìn)行地址加1運(yùn)算時(shí), 其地址值增加了12(放大因子為4x3=12), 這種數(shù)組指針用得較少, 但在處理二維數(shù)組時(shí), 還是很方便的。

(二維數(shù)組指針---行指針)

例如:

int a[3][4], (*p)[4];

p=a;

開始時(shí)p指向二維數(shù)組第0行, 當(dāng)進(jìn)行p+1運(yùn)算時(shí), 根據(jù)地址運(yùn)算規(guī)則, 此時(shí)放大因子為4x4=16, 所以此時(shí)正好指向二維數(shù)組的第1行。和二維數(shù)組元素地址計(jì)算的規(guī)則一樣, *p+1指向a[0][1], *(p+i)+j則指向數(shù)組元素a[i][j]。

int a[3][4]={

{1,3,5,7},

{9,11,13,15},

{17,19,21,23}

};

int main()

{

int i,(*b)[4];

b=a+1; /* b指向二維數(shù)組的第1行, 此時(shí)*b[1]或

**b是a[1][0] */

for(i=1;i<=4;b=b[0]+2,i++) {/* 修改b的指向, 每次增加2 */

printf("%d\t",*b[0]);

}

printf("\n");

for (i=0; i<2; i++) {

b=a+i; /* 修改b的指向, 每次跳過二維數(shù)組的一行 */

printf("%d\t",*(b[i]+1));

}

printf ("\n");

}

程序運(yùn)行結(jié)果如下:

9 13 17 21

3 11 19

注意指針函數(shù)與函數(shù)指針表示方法的不同,千萬不要混淆。

指針函數(shù):

類型標(biāo)識(shí)符 *函數(shù)名(參數(shù)表)int *f(x,y);

首先它是一個(gè)函數(shù),只不過這個(gè)函數(shù)的返回值是一個(gè)地址值。函數(shù)返回值必須用同類型的指針變量來接受,也就是說,指針函數(shù)一定有函數(shù)返回值,而且,在主調(diào)函數(shù)中,函數(shù)返回值必須賦給同類型的指針變量。當(dāng)一個(gè)函數(shù)聲明其返回值為一個(gè)指針時(shí),實(shí)際上就是返回一個(gè)地址給調(diào)用函數(shù),以用于需要指針或地址的表達(dá)式中。當(dāng)然了,由于返回的是一個(gè)地址,所以類型說明符一般都是int。

表示:

float *fun();

float *p;

p = fun(a);

例如:

int *GetDate();

int * aaa(int,int);

函數(shù)返回的是一個(gè)地址值,經(jīng)常使用在返回?cái)?shù)組的某一元素地址上。

int * GetData(int i,int j);

int main(){

int i,j;

do{

printf(“Enter i(1-5),j(1-7)\n”);

scanf(“%d%d”,&i,&j);

}while(i<1 || i>5 || i<1 || j>7);

printf(“%d\n”,*GetDate(i,j));//輸出的是地址

}

int * GetData(int i,int j)

{

static int calendar[5][7]=

{

{1,2,3,4,5,6,7},

{8,9,10,11,12,13,14},

{15,16,17,18,19,20,21},

{22,23,24,25,26,27,28},

{29,30,31,32,33,34,35}

};

return &calendar[i-1][j-1];

}

程序應(yīng)該是很好理解的,子函數(shù)返回的是數(shù)組某元素的地址。輸出的是這個(gè)地址里的值。

函數(shù)指針:

函數(shù)指針是指向函數(shù)的指針變量。通常我們說的指針變量是指向一個(gè)整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。函數(shù)指針可以像一般函數(shù)一樣,用于調(diào)用函數(shù)、傳遞參數(shù)。函數(shù)指針變量的聲明:

typedef int (*fun_ptr)(int,int);

// 聲明一個(gè)指向同樣參數(shù)、返回值的函數(shù)指針類型

以下實(shí)例聲明了函數(shù)指針變量 p,指向函數(shù) max:

#include

int max(int x, int y)

{

return x > y ? x : y;

}

int main(void)

{

/* p 是函數(shù)指針 */

int (* p)(int, int) = & max; // &可以省略

int a, b, c, d;

printf("請(qǐng)輸入三個(gè)數(shù)字:");

scanf("%d %d %d", & a, & b, & c);

/* 與直接調(diào)用函數(shù)等價(jià),d = max(max(a, b), c) */

d = p(p(a, b), c);

printf("大的數(shù)字是: %d\n", d);

return 0;

}

編譯執(zhí)行,輸出結(jié)果如下:

請(qǐng)輸入三個(gè)數(shù)字:1 2 3

大的數(shù)字是: 3

*回調(diào)函數(shù)*

函數(shù)指針作為某個(gè)函數(shù)的參數(shù)。函數(shù)指針變量可以作為某個(gè)函數(shù)的參數(shù)來使用的,回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。簡(jiǎn)單講,回調(diào)函數(shù)是由別人的函數(shù)執(zhí)行時(shí)調(diào)用你實(shí)現(xiàn)的函數(shù)。

實(shí)例中 populate_array 函數(shù)定義了三個(gè)參數(shù),其中第三個(gè)參數(shù)是函數(shù)的指針,通過該函數(shù)來設(shè)置數(shù)組的值。定義了回調(diào)函數(shù) getNextValue,它返回一個(gè)隨機(jī)值,它作為一個(gè)函數(shù)指針傳遞給 populate_array 函數(shù)。populate_array 將調(diào)用 10 次回調(diào)函數(shù),并將回調(diào)函數(shù)的返回值賦值給數(shù)組。

實(shí)例

#include

#include

// 回調(diào)函數(shù)

void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))

{

for (size_t i=0; i

array[i] = getNextValue();

}

// 獲取隨機(jī)值

int getNextValue(void)

{

return rand();

}

int main(void)

{

int myarray[10];

populate_array(myarray, 10, getNextValue);

for(int i = 0; i < 10; i++) {

printf("%d ", myarray[i]);

}

printf("\n");

return 0;

}

編譯執(zhí)行,輸出結(jié)果如下:

16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709

上一篇:Linux中斷子系統(tǒng)的初始化

下一篇:Keepalive機(jī)制

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5,京公海網(wǎng)安備11010802025203號(hào)

回到頂部

主站蜘蛛池模板: 四房色播开心网 | www·377黄·com| 日本视频免费播放 | 国产呻吟久久 | 久久国产精品99国产精 | 人人妻人人藻人人爽欧美一区 | 男人女人双性人人妖太监 | 亚洲人成色7777在线观看不卡 | Y1111111少妇影院 | 五月丁香亚洲综合无码 | 久久网站视频 | 亚洲精品偷拍影视在线观看 | 国产精品精华液网站 | 免费无线乱码一二三四 | 久久久久久九九99精品 | 欧美黑人性生活视频 | 欧美成人免费一区二区 | 免费黄在线看 | 国产成人无码A区在线观看视频不卡 | 亚洲AV日韩精品一区二区三区 | 91www视频| 桃子视频在线观看免费视频网 | 在线观看中文字幕第一页 | 精品乱码卡1卡2卡3免费开放 | 精品人妻无码一区二区三区打不开 | 亚洲av永久无码精品网站在线观看 | 日韩超碰人人爽人人做人人添 | 无遮挡AAAAA大片免费看 | 天堂中文地址 | 午夜寂寞视频无码专区 | 亚洲熟女色情网中文字幕 | SM调教论坛一区 | 麻豆av免费网站 | 亚洲精品一区国产精品丝瓜 | 亚洲精品屋V一区二区 | 狠狠狠狠狠狠干 | 免费的麻豆视频 | 饥渴少妇浪潮AV麻豆传煤 | 色欲香天天天综合网站无码 | 公天天吃我奶躁我爽快A片动漫 | 免费无码AAA片 |