1樓:天雨下凡
month是指標陣列,每個元素都是一個char型指標,指向一個字串的首地址
p是二級指標,p=month,p指向month陣列的首地址,也就是"january"的首地址的地址,*p的值就是"january"的首地址,用"%s"的格式輸出,就是字串"january"
然後p=month+i,month是陣列名,是指向month首地址的const指標,然後給它加上一個整數,就是讓它指向後面的元素,比如p=month+0,就是讓p指向month的首地址,p=month+1,就是指向month的第二個元素的地址,依次類推……
2樓:
問題是正確的,你的想法也是正確的。宣告瞭char **p;就得用p=month+i;,而輸出則是*p。若按你的想法,宣告char *p;,那就得寫p=month[i];,輸出則是p而不能用*p了。
一句話,宣告char **p;有點多餘,但邏輯並不錯。按照提倡的寫法,指標級數儘量少,那就應該優先選擇你的思路。把char **p;改成char *p;,把p=month+i;改成p=month[i];,再把printf("%s\n",*p);改成printf("%s\n",p);,效果與原**是一樣的!
題目是不是想演示一下二級指標的用法?不得而知……
關於c語言的指標問題(指標的地址+1問題) 10
3樓:小p精神
我來給你寫個例子,你參考一下
int *p, *q,*s;
int a[3] = ;
p = a; //將a的首地址賦值給p 那麼p指向的值應該是a[0]的值2
printf("a[0] = %d; *p = %d \n", a[0], *p);
q = &a[0] + 1; //將a[0]的地址向右偏移一位就等於a[1]的地址 a[1] = 8那麼*q應該等於8
s = q + 1; //將q指標向右偏移一位,相當於把a[1]的地址向右偏移一位,即a[2]的地址指向的值是25
//列印驗證一下
printf("a[0] = %d; *q = %d ;a[1] = %d *s = %d\n", a[0], *q,a[1],*s);
4樓:
輸出的四行**分別是:
a的值,
a的地址+1的地址值(並非a的地址,因為你的p值已經+1了),*p表示的是p指向地址的內容值;
*q表示a的地址+17地址上內容的值.
a的地址+1的值,是指向下一個地址,偏移量為a的型別長度
c語言 關於為指標的指標分配記憶體的問題
5樓:匿名使用者
首先:int** 是一個二級指標,它是指標的指標,如果你要申請一個二維陣列,有下面兩個方法:
int** val = (int**)malloc(sizeof(int*) * 10);
int i;
for(i = 0; i < 10)
val[i] = (int*)malloc(sizeof(int) * 10);
然後你可以這樣引用:*(*(val+m)+n) = value;
第二種:int* val = (int*)malloc(sizeof(int) * 10 * 10);
然後這樣引用:*(m*10 + n) = value;
這其實就是個一維陣列,不過你把它看成二維的處理。。
希望對你有幫助哦
6樓:匿名使用者
//給你一段**看看,呵呵。
int i=0,j=0,x=10,y=10;
int **array=null;
//注意,是這樣申請空間的,一次性完成
array=(int**)malloc(sizeof(int)*x*y + y*sizeof(int*));
array[0]=(int*)((char*)array + y*sizeof(int*));
for(i=1;i for( i = 0 ; i < y; i++ )}for( i = 0 ; i < y; i++ )}free(array);//注意,是這樣釋放空間的,一次性完成 7樓: array 是 int * * 型的嗎?我在vc6.0測試,分配記憶體是正確的,但要明白,分配的記憶體都被認為是int*型的,也就是101個int*型的空間。 *(array+j)得到這101個空間中的某個,是int*型,*(*(array+j)+n)是這101個指標中的某一個指向的記憶體空間,而這個記憶體空間沒有分配,所以程式執行時會出錯。至於在16位機器上通過,只是僥倖而已,因為16位機器沒有記憶體保護,所有的空間都能訪問,如果訪問了作業系統的空間,可能不會立即崩潰,但系統有可能出問題的。而32位機器有保護模式,訪問非法空間系統會報錯。 8樓:匿名使用者 使用sizeof,就和機器位數無關~ 二級指標動態分配方式如下: int **a; a=(int**)malloc(m*sizeof(int*)); for(i=0;i a[i]=(int*)malloc(n*sizeof(int)); c語言關於列印指標所指的值的問題 9樓:我要通曉 *a 對應的是二維陣列,a+i 的內容就是第 i 個字串的首地址printf("%s",*(a+i)) 輸出第i個字串printf("%c",*(a[i]+j))輸出第i個字串的第j個字元 char *b 對應的是一維陣列,b = a+iprintf("%c",b) 只能輸出第i個字串的首字母 10樓:中兵勘察海外部 注意,這裡a和b都是指標型別了吶,所以…… 11樓:匿名使用者 最後的printf有問題 %s要的是地址 *b是字元a的值 12樓:匿名使用者 有兩種改法: 1、char *b=a[0]; printf("%s",b); 2、char **b=&a[0]; 13樓:大維 程式改一下!改成char *b = a[0] 試試 關於c語言指標釋放的問題 14樓: 這段話中有好幾個錯誤。 1. 如果有int a, int *b = &a, 這時執行free(b) 一定引起記憶體錯誤。 free只能使用在動態分配的記憶體上,不能用在堆疊或靜態資料上。 類似 int a,或 static int a,這樣的變數定義,是在編譯時已經確定了記憶體位置。 動態分配是在執行時,從堆中臨時分配的記憶體塊(用malloc,或new)。這些記憶體塊需要用 free(malloc)或delete(new)釋放; 2. 變數名實際是記憶體地址的代稱,這句也不完全對 在程式中,變數名代表了「這個地址上的數值」,只有對變數使用&操作,才能得到變數的地址 3. free(b)應該釋放了b這個指標變數 如果指標變數存放了一個動態得到的地址,free(b)釋放的是變數b的數值(不是變數b的地址),由於變數b的數值是一個動態分配得到的地址,所以free釋放的是動態地址。 關於c語言中指標操作字串和指標取值的問題 15樓: 問題一里,如果你想列印字串,printf第二個引數應該是地址而不是地址裡的內容, 如果你想列印一個字元,應該是%c而不是%s應該寫為printf("%s\n",(buf+1)); 或者 printf("%c\n",*(buf+1)); (輸出是e) 問題二和一應該是同樣的錯誤 printf("%s\n",p);是列印整個字串'test' 如果你只列印一個字元,比如s printf("%c\n",*(p+2)); 16樓:匿名使用者 printf輸出字串需要傳入的引數應是你想要開始的地址,把buf+1前面的解引用(*)去掉即可 而*(buf+1)傳遞的是值應該用於輸出字元的情況,如printf("%c\n",*(buf+1)); 第二個同理; 推薦一本c語言語法書,c prime plus ,對於這種基本語法解釋的相當清楚 c語言關於指標的問題,指標的地址 17樓:童之新 printf("%s\n",p);為列印字串,傳的是字串的地址,p就是一個指向這個字串地址,所以沒什麼問題。 若你要列印這個實體地址,直接printf("%d\n",p);就可以拉,你加個*,就是取這個地址的值了,所以printf("%d\n",*p); 等於97(即ascii碼的 a 的值),printf("%d\n",*(p+1)); 等於98(即ascii碼的 b 的值) 關於c語言指標的問題? 18樓:匿名使用者 *(p+5)表示元素a[5]的值。 p是一個指標型別, p+5是a[5]的地址,然後*取只,所以得到的是值。 由於括號的運算優先順序比*高 所以*(p+5)會先執行p+5在取值 19樓:霧漫大武漢 我教你個方法,在大學變成c語言變成中:除了在定義指標變數的時候用到*,變數表示指標以外,其餘地方用到*都一般都表示值,二維陣列另當別論。 所以這個地方就是值 20樓: *(p+5)表示a[5]的值,p+5表示a[5]的地址。(若幫助了你,請採納) 21樓:林家 回答您好,很高興幫您解答這個問題,這邊幫您查詢到了幾個常見問題,望採納,謝謝 strlen是求字串的長度,一定只能是字串,測量字元陣列的長度時,不能用strlen;sizeof是求資料型別所佔記憶體空間的大小,以位元組為單位。 希望對您有所幫助 更多2條 22樓:匿名使用者 值。。。。。。。。。。。。。。。。 這個問題很好啊,其實如果你用printf列印p1和p的話,你會發現這兩個值是相等的,因為他們都是指標,c語言是不區分指標之間的差別的,一切指標都是指標,不管他指向什麼,但是當前面加上 號後,他們就有了區別,p1很顯然是一個char型別,而 p這是一個char 型別。printf會把p1指向地址中的值... 飛翔的蠍子大叔 關於int p1 123這個問題我看了很多資料,在這裡我發表一點看法,該問題非常好,這是c語言需要規範的地方。int p1 123 是非法操作,指標表示地址,地址 123?我是沒有見過這種操作。地址一般用二進位制 八進位制 十六進位制表示,123表示地址根本就是扯淡!這個語句的目的就... 搗蒜大師 這寫操作等價 p p 都是p加,然後 這些操作等價 p p p 相當於先 了,然後p再 include main p 指向2 printf d n p 2 p p 1 p指向3 printf d n p p指向4,再 4 p p 1 p指向5 printf d n p 5,p指向6 p p...關於c語言的指向指標的指標和指標
關於C語言指標問題,C語言指標的賦值問題
關於C語言指標自增運算的問題,c語言中指標可不可以用在自增自減運算子中