日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux C编程---指针数组简析(二维数组、多级指针)

發布時間:2023/12/9 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux C编程---指针数组简析(二维数组、多级指针) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

講到指針和數組,先給大家看一道例題:

題目:填空練習(指向指針的指針)
1.程序分析:     
2.程序源代碼:
main()
{ char *s[]={"man","woman","girl","boy","sister"};
char **q;
int k;
for(k=0;k<5;k++)
{       ;/*這里填寫什么語句*/
  printf("%s\n",*q);
}
}

指向指針的指針是什么呢?我們把一個指向指針變量的指針變量,成為多級指針變量,char **p;這種。

我們再看這道題 char *s[]={"man","woman","girl","boy","sister"};這時一個字符串數組,為什么存放字符串的數組要定義成指針數組呢?我們先來看看指針數組是什么

指針數組的實質還是數組,是存放指針的數組int *p[]? ,(int *)p[]是數組指針,指向數組地址的指針,這兩個概念好像很繞是吧,很難分辨,在這里,博主將自己記憶的方法告訴大家,int *p[]? 大家可以根據運算符優先級來記憶,[]的優先級 > *的優先級,所以這首先是個數組,然后才是指針,所以是指針數組;(int *)p[],()和[]優先級相等,但()是左結合,所以(int *)p[]先是指針,后是數組,所以這是個數組指針。

回到這一題,看這一句printf("%s\n",*q);我們知道%s后面跟的應該是一個地址,而*p是p中所指的數據,所以p地址中保存的還是一個地址,這就是多級指針,而我們用char **q;我們只知道q所指向的首地址,后面的數據如何分配,我們不得而知,所以這道題應該怎么做呢?

大家看看我們添加的內容:

[cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • int?main()??
  • {??
  • ????char?*s[]={"man","woman","girl","boy","sister"};??
  • ????char?**q;??
  • ????int?k;??
  • ????for(k?=?0;k?<?5;k++)??
  • ????{??
  • ????????q?=?&s[k];??
  • ????????printf("%s\n",*q);??
  • ????}??
  • }??
  • 大家看輸出結果:

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/shuzu$?gcc?-o?shuzu5?shuzu5.c??
  • fs@ubuntu:~/qiang/shuzu$?./shuzu5??
  • man??
  • woman??
  • girl??
  • boy??
  • sister??
  • fs@ubuntu:~/qiang/shuzu$???
  • ?

    為什么我們給的是p = &s[k]而不是*p = &s[k]呢?這里我們應該先理解二維數組

    提到二維數組,我們又不得不提一維數組,一維數組 int a[n] 這里int是我們數據元素的數據類型,a是什么,a是數組名,代表數組的首地址,是數組第一個元素的地址,也就是可以說,a是int???a[n]的地址,a[0]也是;這里記住a是地址常量,是常量!常量!常量!重要的事說三遍!常量的特性是什么,不能對其賦值,大家記住這一點!"[]"是變址運算符,所以*(a+i)和a[i]無條件等價!n是數據的偏移量,是數據的偏移量,而不是字節的偏移量!這點和指針的*p++一樣,是數據的偏移量,因為我們數組里放的是整型數據,也可能是字符型數據,所占字節大小是不一樣的,所以是數據的偏移量!

    我們回到二維數組??以int [3][4]為例,如下圖

    我們知道a[3]中a是地址,a[3][4]呢?a這里也是地址,存放的是什么數據呢?看圖就知道,存放的是a[0]? a[1]? a[3],而a[0] a[1] a[2]是什么呢?其實是地址,地址里指向的分別是a[0][0]? a[1][0]?? a[2][0]的數據,那我們是不是也可以將二維數據當成一個二級指針來看呢?大家思考一下。

    博主思考了一下,說a里面存放的是a[0] ?a[1] a[2]的地址不太確切 ,但a[0] ?a[1] a[2]在這里確實是地址 ,上面說到二維數組是否可以看成二級指針,當然不能這樣看,大家應該知道,a確實是代表地址,但它與指針有什么區別呢?大家看a[1] 的地址如何表示呢?是a+1,指針怎么表示呢?是p+1,好像是一樣哦,但大家應該明白這里?a 是常量 ?,p是變量,a + 1 中 a 的值沒有發生變化,數組里面所有數據的地址都是由唯一的常量 a 來確定的! 而p + 1, p 的值已經發生了變化,因為 p 是變量!!!!!

    ?我們再看看char *s[]={"man","woman","girl","boy","sister"},為什么要加*呢?因為存放的是字符串啊。字符串用地址來表示的啊!所以二級指針? 二維數組? 指針數組 這幾個概念有時很容易把人搞暈,大家一定要注意分辨!

    今天先寫到這,后面會指針數組的深入內容!

    總結

    以上是生活随笔為你收集整理的Linux C编程---指针数组简析(二维数组、多级指针)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。