① c語言中指針*p中的p和數組a[10]中的a有什麼區別…在用法上和意義上…求答案
二重指針,首先你要有數組的概念,數組就是一片連續的存儲地址,一維的情形用一個指針來實現對數組中數據的引用。如 int a[10];這句話實際是在內存中申請了10個連續的地址塊,每塊地址可以用來存儲一個int型數據。而a就是用來引用數據的指針,比如a[2],實際就引用了第三塊地址(從0開始)。 而二維數組和一維的原理是一樣的也是連續的地址塊,只是引用的方式不一樣,術語上講就是二重指針;int a[3][3],開辟了9個int的連續地址,a不能直接引用其中的某一塊a,你可以把它看做是矩陣,a[0]是指向第一行,第一行可以看做數組,那麼a[0]就是一維數組的指針,a[0][1]就表示第一行那個一維數組中的第二個元素;類似a[1][2]就表示第二行那個一維數組中的第三個元素。 這塊內容要畫出內存圖就能更好的理解了,你自己試著畫一畫。其實很簡單不管是幾維的數組他們的物理存儲都是連續的一塊內存,只是解釋方式不同而已。重要的不是他們的實際的物理存儲,而是他們的邏輯結構(在程序中你要怎麼去解釋)
② 怎麼理解C語言二重指針的這幾個輸出剛學指針有點懵逼QAQ
int *是指針變數,int**是指向指針的變數
指針變數,也是變數,本身也有地址,只不過這個變數裡面放的是地址。
所以這里p1指向變數x(變數x里存放的值是23,變數p1里存放的是x的地址).
---直接寫p1,就表示取p1這個變數的值(也就是x的地址)。
---寫*p1,就是取變數p1所存放的那個地址對應的值。
同理p2是指向指針的變數,顧名思義,p2指向變數p1。
---直接寫p2,就是表示取變數p1的地址。
---寫*p2就是取p2所存放的地址對應的值(也就是p1的值,也就是x的地址)。
---寫**p2,你可以看成*(*p2),那麼就等同於*p1,取的是x里存放的值23。
③ C語言中char**是什麼意思 和char*有什麼區別呀
意思:char ** 指向字元型指針的指針;
區別:
char *字元型指針,指向一個字元;
數據在內存中的存儲區域
1、棧:就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的存儲區。裡面的變數通常是局部變數、函數參數等。
2、堆:就是那些由new或malloc分配的內存塊,在不適用時,要手動用delete或free來釋放內存區域。
3、全局/靜態存儲區:全局變數和靜態變數被分配到同一塊內存中,他們共同佔用同一塊內存區。
4、常量存儲區:這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改
char**最常使用在main函數中:
int main(int argc,char**argv);
等同於int main(int argc,char*argv[])
等同於int main(int argc,string argv)(C語言中並不直接包含字元串類型,此處便於理解,所以使用string類型)
char是字元變數的說明符
字元變數的取值是字元常量,即單個字元。字元變數的類型說明符是char。字元變數類型說明的格式和書寫規則都與整型變數相同。
(3)c語言二重指針擴展閱讀:
欄位類型
在MYSQL中,欄位類型char是指:使用指定長度的固定長度表示的字元串;比如char(8),則資料庫會使用固定的1個位元組(八位)來存儲數據,不足8位的字元串在其後補空字元。
字元轉換
在excel中char函數用於返回對應發於數字代碼的字元。其用法:=char(number)
其中,參數number為轉換的字元代碼,介於0~255之間,char佔一個位元組,也就是8個二進制位,但它表示的是有符號的類型,所以表示的范圍是-128~127;uchar表示無符號的類型,所以表示的范圍是0~255。
代數概念
char是characteristic的簡寫,表示一個環或者域的特徵,即最小的非負整數n,使ne=0。(e為單位元)。
網路——char(計算機語言關鍵字)
④ 請問C語言中**a[9]是什麼意思呢
"**應該表示2維指針" -- 不叫二維指針,而叫二重指針,就是指針的指針。
**a[9] -- 這是一個 二重指針數組。數組有9個單元,可以指向9個 二重指針。
用它來表示一個三維數組,比較復雜,在作為三維數組使用前,須要分配它的存儲單元,看下面程序。
程序第一部分,**p[9] 作為二重指針數組。第二部分,變成p[3][2][9]三維數組.
#include <stdio.h>
#include <stdlib.h>
main()
{
int a=1,b=2,c=3;
int *aa,*bb,*cc; // 指針
int **aaa,**bbb,**ccc; // 二重指針
int **p[9],i,j,k;
aa=&a; bb=&b; cc = &c; // 賦地址
aaa = &aa; bbb=&bb; ccc = &cc; // 賦地址
p[0] = aaa; p[1] = bbb; p[2] = ccc; // 賦地址
p[6] = aaa; p[7] = bbb; p[8] = ccc; // 賦地址
printf("%d %d %d\n", **p[0], **p[1], **p[2]); // 列印值
printf("%d %d %d\n\n", **p[6], **p[7], **p[8]); // 列印值
// 第二部分 分配 指針 指向的單元
for ( i=0;i<9;i++) p[i] = (int **) malloc(sizeof(int *) * 2);
for (j=0;j<2;j++) {
for ( i=0;i<9;i++){
p[j][i] = (int *) malloc(sizeof(int) * 3);
}
};
// 賦值 1,2,3,4。。。54 並列印值
for (i=0;i<3;i++) for (j=0;j<2;j++) for (k=0;k<9;k++) { p[i][j][k] = a; a++;};
for (i=0;i<3;i++) for (j=0;j<2;j++) for (k=0;k<9;k++) printf("%d\n",p[i][j][k] );
}