#include
int main(void)
執行這段**,會出現錯誤嗎?如果出現錯誤,是什麼錯誤?
分析:printf一種常規的用法就是printf("please input a data:");這種用法相信很多人都使用過,但是將這種用法分析一下,這樣的用法printf函式接收到的引數是乙個常量字串的首位址,然後就可以輸出這個字串,所以上面的**也是將字串的首位址(存放於字元型指標s中)傳遞給了printf,所以這段**的執行不會出現任何問題,甚至編譯的時候連警告都不會出現。再看下面的一段**:
#include
int main(void)
請問這段**是否正確,如果不正確,錯誤出在**?
分析:要分析這個問題也還是比較容易的,printf函式和scanf函式是c語言中典型的兩個變長引數函式,printf也不知道自己會接收到多少個引數,它唯一知道的就是如果在輸入的字串說明符中有多少個輸出控制符(%d等)就會到後面去解析多少個引數,如果解析不到的話這種情況下才會報錯。但是如果前面並沒有說明需要引數,而後面跟了引數的話,這個它是不會理會的,所以這段**編譯和執行都不會出現問題,還是跟上面一樣,編譯的時候甚至警告都不會出現。
現在開始言歸正傳說說指標,這次就簡單的說說指標的加減運算,請看下面一段**:
#include
int main(void)
請問程式輸出的兩個值一樣嗎?如果不一樣,兩者相差多少?
分析:這個問題需要對指標的運算理解比較深入才能答對,正確的答案是兩者輸出是一樣的,可能很多人碰到這個問題的時候會想,&a[0]之後得到的是第0個單元的位址,這個位址和&a[1]也就是第1個單元的位址應該是相差sizeof(int)個位元組,所以兩者輸出應該相差3。但是這樣的演算法忽略了指標的加減運算規則,指標或者說位址的運算往往依賴於指標或者位址的型別,比如我們常常會用int *p=a; printf("%d ", *p++);這種用法,通過p++就可以指向下乙個int型別的單元!這就說明p裡面的值被p++這條語句增加了4,這一層的運算程式設計師是看不見的,後面實質進行的運算相當於p=p+1*sizeof(int);這裡也是一樣,int型的位址加1,並不是位址值簡單的加1,而是加了sizeof(int)個1,所以兩者輸出是一樣的。這個問題可以定義乙個字元型的變數s,然後定義乙個int型別的指標p,使用p=&s來給p賦值,這個時候編譯器會給出諸如:不能用char *賦值給int *指標的錯誤或者警告,這個也證明對某種型別的變數進行取位址操作,得到的資料型別是該資料型別指標。再看乙個更極端的例子:
#include
int main(void)
這個程式的輸出是多少呢?
程式執行之後輸出了1,這個當然是在32位機上執行的結果,這個例子可以有助於理解上面的分析過程。
C語言 指標運算
p a 將變數位址賦值給指標 p array 將陣列位址賦值給指標 p array i 將陣列元素賦值給指標 p1 p2 將指標位址賦值給指標 include 引用函式庫 void main f0889414 f0889414 f0889414 10 10 10 p 1 和 p 意義不相同,前者沒有...
指標運算 c語言
指標運算 加法 每一次加1 就是所指向的首位址加乙個sizeof 型別 int a 10 int p a p i a 0 i 減法同上 但是同樣要注意範圍的情況 值得注意的是 也有兩個指標做減法 但是兩個指標相減的意思是位址的差值 sizeof 型別 的優先順序很高 但是沒 高 p 常用於陣列的的連...
C語言指標運算
int a int p a include intmain int p a printf p p n p printf p 1 p n p 1 printf p d n p p a 0 printf p 1 d p 1 p 1 a 1 return0 輸出 p 000000000062fe00 p ...