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所指向的首地址,後面的資料如何分配,我們不得而知,所以這道題應該怎麼做呢?
大家看看我們新增的內容:
#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);
}
}
大家看輸出結果:
[email protected]:~/qiang/shuzu$ gcc -o shuzu5 shuzu5.c
[email protected]:~/qiang/shuzu$ ./shuzu5
man
woman
girl
boy
sister
[email protected]:~/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程式設計---指標陣列簡析(二維陣列、多級指標)
講到指標和陣列,先給大家看一道例題: 題目:填空練習(指向指標的指標) 1.程式分析: 2.程式原始碼: main() { char *s[]={"man","woman","girl","boy","sister"}; char **q; int k; for(
Linux驅動之平臺設備驅動模型簡析(驅動分離分層概念的建立)
技術 描述 rst 操作 mem iou 系統 簡單 reg Linux設備模型的目的:為內核建立一個統一的設備模型,從而有一個對系統結構的一般性抽象描述。換句話說,Linux設備模型提取了設備操作的共同屬性,進行抽象,並將這部分共同的屬性在內核中實現,而為需要新添加設備
Linux VFS機制簡析(二)
Linux VFS機制簡析(二) 接上一篇Linux VFS機制簡析(一),本篇繼續介紹有關Address space和address operations、file和file operations、dentry和dentry operations和dentry cache API。 Address Sp
我的譚浩強版《c++程式設計》習題答案參考(新近新增第六章指標,將繼續)
我正在學習譚浩強的《c++程式設計》,這是我所學到的章節所做的習題,希望能記錄下程式設計學習的進步過程。每做完一章的練習,就把它們放上網。 《c++程式設計
(排序演算法)linux c語言實現選擇排序演算法(氣泡排序的略微改進版)
快速排序演算法和氣泡排序演算法是差不多的,都是要兩層迴圈,外迴圈是要比較的個數,其實就是元素的個數,內迴圈就是外層那個標記和其他的比較大小, 氣泡排序是相鄰的兩個,兩兩比較,最後交換出一個最大或者最小值, 快速排序是在氣泡排序的基礎上,找出那個最小的或者最大的,但是不是直接交換,
學習筆記 c++ (C++ new申請一塊記憶體空間存放二維陣列)
程式碼: #include<iostream> using namespace std; int main(int argc, char** argv) { int n=3,m=3; int count =1; int
ffmpeg原始碼簡析(二)av_register_all(),avcodec_register_all()
av_register_all() 該函式在所有基於ffmpeg的應用程式中幾乎都是第一個被呼叫的。只有呼叫了該函式,才能使用複用器,編碼器等。 av_register_all()呼叫了avcodec_register_all()。avcodec_regis
linux網路程式設計之TCP/IP基礎(二):利用ARP和ICMP協議解釋ping命令
一、MTU 乙太網和IEEE 802.3對資料幀的長度都有限制,其最大值分別是1500和1492位元組,將這個限制稱作最大傳輸單元(MTU,Maximum Transmission Unit)。如果I
9、C語言中二維陣列及陣列名及指向二維陣列的指標變數
#include <stdio.h> #include <stdlib.h> //與二維陣列相關的指標變數([] 比 *優先順序高) //在一般指標變數指向二維陣列,或者n維陣列,要直接操作a[i][j],對指標的操作必須有兩個符號(其中不出現&,如果有&則相應的加
C語言----(二維陣列,複雜資料型別的判斷)
一、二維陣列的定義賦值1、定義一個三行四列的二維陣列,如下:int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; int brr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //陣列arr與br
圖解:輸入任意一個數值,列印一個螺旋矩陣(二維陣列)
更多演算法題請看本人部落格分類--演算法 public class Demo11 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(t
從零開始之驅動發開、linux驅動(二十九、mmap原理)
一、概念 mmap是一種記憶體對映檔案的方法,即將一個檔案或者其它物件對映到程序的地址空間,實現檔案磁碟地址和程序虛擬地址空間中一段虛擬地址的一一對映關係。實現這樣的對映關係後,程序就可以採用指標的方式讀寫操作這一段記憶體,而系統會自動回寫髒頁面到對應的檔案磁碟上,即完成了對檔案的操作而不必
資料結構演算法題/最大子矩陣(二維陣列中和最大的連續子矩陣)
給定一個矩陣,都是整數,求出其中的最大子矩陣。 可以將問題轉換為求一維陣列的最大子序列和的問題。具體見https://blog.csdn.net/fkyyly/article/details/83088247 /** * 其實思想是控制新的子矩陣開始,按列相加變成一維陣列,然後再求一維陣列
《程式設計基礎》實驗題目1 二維陣列 氣泡排序
題目:編寫函式,對於給定的二維整型陣列,首先對每行從小到大排序,之後對每列從小到大排序;反覆執 行上述排序過程,直到沒有變動為止。注:作為實參的二維整型陣列,每行元素個數不低於 3 且每列 元素個數不低於 4。 演算法分析: 1. 為方便傳遞引數
劍指offer第一題JavaScript實現(二維陣列的查詢)
題目: 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 解答思路: 二維陣列類比為一個矩陣,是從左至右、從
openjudge 二維陣列右上坐下遍歷(二維陣列)
二維陣列右上左下遍歷 檢視提交統計提問 總時間限制: 1000ms 記憶體限制: 65536kB 描述 給定一個row行col列的整數陣列array,要求從array[0][0]元素開始
複習指標陣列以及如何把二維陣列賦值給二維指標
#include <cstddef> #include <iostream> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : v
旋轉影象(二維陣列的旋轉)——LeetCode陣列演算法題
給定一個 n × n 的二維矩陣表示一個影象。將影象順時針旋轉 90 度。說明:你必須在原地旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉影象。示例 1:給定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋轉輸入矩陣,使其變為
奇數階魔方(二維陣列)
#include<stdio.h> #define N 20 int main() { int n,k,i,j,T; int a[N][N]; scanf("%d",&T); while(T--) { scanf("%d",&
java將集合轉換為陣列(二維陣列)
public class ListToArray { /** * 獲取物件屬性,返回一個字串陣列 * * @param o 物件 * @return String[] 字串陣列 */ private St