亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 嵌入式指針數組

嵌入式指針數組 時間:2018-09-29      來源:未知

題目:指針數組,數組指針,指針函數及函數指針相關的辨析

首先我們要明確:

“指針數組”是數組,“數組指針”是指針。指針數組的每個數組元素都是一個指針,而數組指針是指向一個數組的指針。

“指針函數”與“函數指針”容易搞錯,簡單的辨別方式就是看函數名前面的指針*號有沒有被括號()包含,如果被包含就是函數指針,反之則是指針函數。指針函數本質是一個函數,函數返回類型是某一類型的指針。函數指針則是一個指針,指向聲明中規定的返回值和參數類型及個數嚴格一致的函數。

指針數組:

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

實例

#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;

}

當上面的代碼被編譯和執行時,它會產生下列結果:

Value of var[0] = 1

Value of var[1] = 2

Value of var[2] = 3

可能有時我們想要讓數組存儲指向 int或 char 或其他數據類型的指針。下面是一個指向整數的指針數組的聲明:

int *ptr[MAX];

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

#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]; /* 賦值為整數的地址 */

}

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

{

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

}

return 0;

}

當上面的代碼被編譯和執行時,它會產生下列結果:

Value of var[0] = 1

Value of var[1] = 2

Value of var[2] = 3

您也可以用一個指向字符的指針數組來存儲一個字符串列表,如下:

實例

#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;

}

當上面的代碼被編譯和執行時,它會產生下列結果:

Value of names[0] = hello!

Value of names[1] = we

Value of names[2] = are

Value of names[3] = changke

數組指針:

定義如下的指針變量:

int (*p)[3];

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

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

例如:

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

p=a;

開始時p指向二維數組第0行, 當進行p+1運算時, 根據地址運算規則, 此時放大因子為4x4=16, 所以此時正好指向二維數組的第1行。和二維數組元素地址計算的規則一樣, *p+1指向a[0][1], *(p+i)+j則指向數組元素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指向二維數組的第1行, 此時*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的指向, 每次跳過二維數組的一行 */

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

}

printf ("\n");

}

程序運行結果如下:

9 13 17 21

3 11 19

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

指針函數:

類型標識符 *函數名(參數表)int *f(x,y);

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

表示:

float *fun();

float *p;

p = fun(a);

例如:

int *GetDate();

int * aaa(int,int);

函數返回的是一個地址值,經常使用在返回數組的某一元素地址上。

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];

}

程序應該是很好理解的,子函數返回的是數組某元素的地址。輸出的是這個地址里的值。

函數指針:

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

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

// 聲明一個指向同樣參數、返回值的函數指針類型

以下實例聲明了函數指針變量 p,指向函數 max:

#include

int max(int x, int y)

{

return x > y ? x : y;

}

int main(void)

{

/* p 是函數指針 */

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

int a, b, c, d;

printf("請輸入三個數字:");

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

/* 與直接調用函數等價,d = max(max(a, b), c) */

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

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

return 0;

}

編譯執行,輸出結果如下:

請輸入三個數字:1 2 3

大的數字是: 3

*回調函數*

函數指針作為某個函數的參數。函數指針變量可以作為某個函數的參數來使用的,回調函數就是一個通過函數指針調用的函數。簡單講,回調函數是由別人的函數執行時調用你實現的函數。

實例中 populate_array 函數定義了三個參數,其中第三個參數是函數的指針,通過該函數來設置數組的值。定義了回調函數 getNextValue,它返回一個隨機值,它作為一個函數指針傳遞給 populate_array 函數。populate_array 將調用 10 次回調函數,并將回調函數的返回值賦值給數組。

實例

#include

#include

// 回調函數

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

{

for (size_t i=0; i

array[i] = getNextValue();

}

// 獲取隨機值

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;

}

編譯執行,輸出結果如下:

16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709

上一篇:Linux中斷子系統的初始化

下一篇:Keepalive機制

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 欧美一级黄色小说 | 欧美日韩激情在线一区 | 4444在线观看 | 日韩视频在线观看中字 | 欧美在线观看一区二区三区 | 欧美日韩中文字幕 | 国产日本高清动作片www网站 | 欧洲乱码伦视频免费 | 久久精品免视看国产陈冠希 | 国产麻豆剧果冻传媒观看免费视频 | 在线看片中文字幕 | 亚洲97在线 | 青青青手机在线观看 | 六九视频在线观看 | 国产精选在线 | 国产情侣第一页 | 国产精品大白天新婚身材 | 日本成人免费 | av在线影院 | 中文字幕日本久久2019 | 久久这里只有精品66 | 国产午夜大片 | 日韩在线视频一区 | 中国xxxx视频播放免费 | 人人成人免费公开视频 | 日本高清www色 | 国产欧美日韩精品第二区 | 亚洲天堂视频在线观看免费 | 国产成人精品美女在线 | 99视频国产热精品视频 | 欧美精品亚洲精品日韩 | 超级碰97 | 91精品论坛 | 欧美白人和黑人xxxx猛交视频 | 欧美黑人xxxx| 国产专区视频 | 人人想人人人爽人人叫 | 黄毛片免费 | 国产成人18 | 日本jzz| 久草免费看 |