double sz[5]={98,87,65,43,76};
double *ptr1,*ptr2;
ptr1=&sz;
for(int i=0;i<5;i++){
printf("%.2lf \n",*ptr1++); // *ptr1++ 如何理解?
}
如上述代碼, *ptr1++ 如何理解?
uj5u.com熱心網友回復:
這樣要看優先級,即*和++誰的優先級高。建議樓主自己查一查。這個運算式的結合性是*(ptr1++);即先參考后自增指標。
uj5u.com熱心網友回復:
參考指標的值,然后再將指標+1,指向sz[1]uj5u.com熱心網友回復:
ptr1=&sz;這個就錯了,ptr1型別是double *,&sz型別是double (*)[5]
*ptr1++
++的優先級高于*,先++,一次性加了5 * sizeof(double)位元組,到了sz陣列最后面一個元素的下一個元素的地址 再解參考 也不能直接列印 解參考之后是一個陣列
uj5u.com熱心網友回復:
相當于
printf("%.2lf \n",*ptr1);
ptr1++;
原因是右結合符++的優先級低于指標運算子*
而括號也提升不了右置++的運算子
uj5u.com熱心網友回復:
之前的解釋有誤
*ptr1++
后++的優先級高于* 是先后++,再解參考,新的值做了++,但是這個運算式使用的還是老的值,*解除參考得到的是一個陣列,不能直接列印
后++一次性加了5 * sizeof(double)位元組,到了sz陣列最后面一個元素的下一個元素的地址
uj5u.com熱心網友回復:
如四樓所說,你這個根本編譯都通過不了啊
uj5u.com熱心網友回復:
可以編譯的
uj5u.com熱心網友回復:
ptr1=&sz;
這個就錯了,ptr1型別是double *,&sz型別是double (*)[5]
*ptr1++
++的優先級高于*,先++,一次性加了5 * sizeof(double)位元組,到了sz陣列最后面一個元素的下一個元素的地址 再解參考 也不能直接列印 解參考之后是一個陣列
如四樓所說,你這個根本編譯都通過不了啊
可以編譯的
孩子把你的東西扔了吧 換個東西學習 什么垃圾軟體 這都能編譯 搞點正常的東西學習 這種型別不兼容還能編譯過 你真可以扔了
uj5u.com熱心網友回復:
ptr1=&sz;哦 對了這個是把 double (*)[5] 型別強制轉換為double* 雖然不兼容但是可以轉換 有的系統會警告有的會報錯
那就沒問題了 *ptr1++ 是一級指標的后++ 和解參考
uj5u.com熱心網友回復:
ptr1=&sz;
哦 對了這個是把 double (*)[5] 型別強制轉換為double* 雖然不兼容但是可以轉換 有的系統會警告有的會報錯
那就沒問題了 *ptr1++ 是一級指標的后++ 和解參考
codeblocks 很爛嗎? 我看很多人都在用啊!
uj5u.com熱心網友回復:
沒用過。學習C語言 最好是在linux環境下
作業中基本都是在LINUX環境下編譯 環境不一樣 會產生不一樣的編譯結果和理解
如你寫出來的
ptr1=&sz; // 型別不一致的賦值 看你接下來的列印 你本意是 ptr1 = sz,能正確是因為sz和&sz雖然型別不一致,但是它們倆的地址值是一樣的,ptr1 = &sz右邊先拿到右值 也就是sz的地址值,ptr1=&sz兩邊型別不一致,需要賦值給double *型別的ptr1,然后把這個地址值強制轉換為ptr1的型別也就是double *
for(int i=0;i<5;i++){
printf("%.2lf \n",*ptr1++); // *ptr1++ 如何理解?
}
uj5u.com熱心網友回復:
一方面有的同學學習 c 語言可能就是學校的一門課程,跟將來就業沒關系;
另一方面,如果剛學習就在 linux 環境的話,還是有點困難的,也沒必要。
codeblock 雖然在正經生產環境不怎么用,但是學習還是可以的。
樓主只要下載正經的版本就可以了,切記不要一開始對自己太苛刻,步步為營 => 寸步難行。
uj5u.com熱心網友回復:
一方面有的同學學習 c 語言可能就是學校的一門課程,跟將來就業沒關系;
另一方面,如果剛學習就在 linux 環境的話,還是有點困難的,也沒必要。
codeblock 雖然在正經生產環境不怎么用,但是學習還是可以的。
樓主只要下載正經的版本就可以了,切記不要一開始對自己太苛刻,步步為營 => 寸步難行。
就是要對自己苛刻 有學習軟體的時間還不如學習一下怎么搞linux環境 學習的更準確 一個不正常的軟體學習錯誤的知識 到時候害人害己
uj5u.com熱心網友回復:
++優先級雖然高于*,但是++屬于右結合型。所以先進行取值,然后地址再加一,指向下一個陣列元素uj5u.com熱心網友回復:
一方面有的同學學習 c 語言可能就是學校的一門課程,跟將來就業沒關系;
另一方面,如果剛學習就在 linux 環境的話,還是有點困難的,也沒必要。
codeblock 雖然在正經生產環境不怎么用,但是學習還是可以的。
樓主只要下載正經的版本就可以了,切記不要一開始對自己太苛刻,步步為營 => 寸步難行。
指標型別不匹配就是錯 哪來這么多歪理
C里面是一個警告
C++直接Error糊你一臉
哪個老師說這樣做沒問題
那就是誤人子弟
uj5u.com熱心網友回復:
```hello
```
uj5u.com熱心網友回復:
printf("%.2lf \n",*ptr1);ptr++;
uj5u.com熱心網友回復:
好煩哦,你看看我在 7 樓說的好吧,我第二次評論只是想提醒樓主不要過分糾結環境。
哪來的這么多杠精啊?有腦子不?
uj5u.com熱心網友回復:
首先前面ptr1=&sz就錯了,指標其實就是存盤資料的一個地址,&是取地址運算子,而陣列名其實就是陣列首元素的地址,即&sz[0]==szuj5u.com熱心網友回復:
哎呀,同學們自己組織起“混淆的C”討論了。又是指標!老話題,太好玩了。uj5u.com熱心網友回復:
對于++運算子的討論,已成經典。uj5u.com熱心網友回復:
*ptr1++先不說。先說說ptr1=&sz; 這個運算式在早初是可以在vc60通過的,后來忽然就報錯了。可能推薦這樣賦值:*ptr1=sz; 看好了吧?型別匹配避開了指標與參考的復雜性,都是double 型別。一般陣列和指標是同構的,只是指標比較便于表示非正則資料。uj5u.com熱心網友回復:
不是*ptr1++,是ptr1++吧,這個指標ptr1指的是頭地址(就是sz[0])后面的++就是回圈一次加一次,地址往后移,這樣就可以依次把sz[0],sz[1],sz[2]…直到回圈結束uj5u.com熱心網友回復:
指向下一個陣列元素uj5u.com熱心網友回復:
*ptr1++先解參考后增量*++ptr1先增量后解參考
uj5u.com熱心網友回復:
遇到這種類似問題,能編譯的話自己單步運行一下,理解會更深一點uj5u.com熱心網友回復:
*ptr1++-->*的優先級高,所以是先*ptr,再++uj5u.com熱心網友回復:
*ptr1++-->*的優先級高,所以是先*ptr,再++
uj5u.com熱心網友回復:
*ptr1++先不說。先說說ptr1=&sz; 這個運算式在早初是可以在vc60通過的,后來忽然就報錯了。可能推薦這樣賦值:*ptr1=sz; 看好了吧?型別匹配避開了指標與參考的復雜性,都是double 型別。一般陣列和指標是同構的,只是指標比較便于表示非正則資料。
你這個*ptr1=sz 就是直接錯誤 更不靠譜
uj5u.com熱心網友回復:
樓主你的編譯器挺神奇啊!估計是我的編譯器版本太新了。我這邊ptr1=&sz;是肯定報錯的我們一般都這么寫:ptr1=&sz[0];
uj5u.com熱心網友回復:
樓主,你的編譯器不靠譜呀!應該使用C-FREE5.0 編譯器。我用C-FREE5.0 編譯器編譯后發現是錯誤的。
把 ptr1=&sz; 修改為 ptr1=sz; 編譯通過
uj5u.com熱心網友回復:
指標的移動,先訪問第一個元素,i=1,i<5成立 繼續訪問下一個元素,以此類推直到i<5不成立。最后列印輸出。uj5u.com熱心網友回復:
*ptr1++,在這里可以改寫為:ptr1[i]。差異是回圈后ptr1指標內容不變,但可讀性應該要高一些。uj5u.com熱心網友回復:
++優先級雖然高于*,但是++屬于右結合型。所以先進行取值,然后地址再加一,指向下一個陣列元素
它兩個的優先級不是一樣的嗎?
uj5u.com熱心網友回復:
首先,ptr=&sz就錯了,陣列名就是指標,還對指標取地址,肯定是錯的,應該把取地址符去掉才行。執行完這條陳述句之后,ptr就指向了陣列的第一個元素的地址,那么ptr++的意思是用完之后再加一,意思就是先*ptr再ptr加1。比如說ptr現在指向第0個元素,那么先輸出第0個元素,下次就輸出第一個元素。還不懂去我的主頁看看我寫的指標的文章uj5u.com熱心網友回復:
先取值,地址后移一次uj5u.com熱心網友回復:
編譯不過吧轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/124460.html
標籤:C語言
上一篇:大佬們,江湖救急
下一篇:求助C語言
