詳解C語言數(shù)組靈活多變的訪問形式
C語言中的指針使得代碼的編寫非常靈活,如果指針能夠和數(shù)組結(jié)合,那將會有更多的“花招”,請看下面的代碼:
#include <stdio.h> int main(){ char str[20] = "c.biancheng.net"; char *s1 = str; char *s2 = str+2; char c1 = str[4]; char c2 = *str; char c3 = *(str+4); char c4 = *str+2; char c5 = (str+1)[5]; int num1 = *str+2; long num2 = (long)str; long num3 = (long)(str+2); printf(" s1 = %s\n", s1); printf(" s2 = %s\n", s2); printf(" c1 = %c\n", c1); printf(" c2 = %c\n", c2); printf(" c3 = %c\n", c3); printf(" c4 = %c\n", c4); printf(" c5 = %c\n", c5); printf("num1 = %d\n", num1); printf("num2 = %ld\n", num2); printf("num3 = %ld\n", num3); return 0; }
運行結(jié)果:
s1 = c.biancheng.net
s2 = biancheng.net
c1 = a
c2 = c
c3 = a
c4 = e
c5 = c
num1 = 101
num2 = 6421984
num3 = 6421986
怎么樣,夠暈吧,如果你嗤之以鼻,那么恭喜你,你的C語言基礎(chǔ)很扎實。
1) str 既是數(shù)組名稱,也是一個指向字符串的指針;指針可以參加運算,加 1 相當(dāng)于數(shù)組下標(biāo)加 1。
printf() 輸出字符串時,要求給出一個起始地址,并從這個地址開始輸出,直到遇見字符串結(jié)束標(biāo)志\0。s1 為字符串 str 第 0 個字符的地址,s2 為第 2 個字符的地址,所以 printf() 的結(jié)果分別為 c.biancheng.net 和 biancheng.net。
2) 指針可以參加運算,str+4 表示第 4 個字符的地址,c3 = *(str+4) 表示第4個字符,即 'a'。
3) 其實,數(shù)組元素的訪問形式可以看做 address[offset],address 為起始地址,offset 為偏移量:c1 = str[4]表示以地址 str 為起點,向后偏移4個字符,為 'a';c5 = (str+1)[5]表示以地址 str+1 為起點,向后偏移5個字符,等價于str[6],為 'c'。
4) 字符與整數(shù)運算時,先轉(zhuǎn)換為整數(shù)(字符對應(yīng)的ASCII碼)。num1 與 c4 右邊的表達式相同,對于 num1,*str+2 == 'c'+2 == 99+2 == 101,即 num1 的值為 101,對于 c4,101 對應(yīng)的字符為 ‘e',所以 c4 的輸出值為 'e'。
5) num2 和 num3 分別為字符串 str 的首地址和第 2 個元素的地址。
為了加深大家的理解,請繼續(xù)閱讀下面的代碼:
#include <stdio.h> #include <stdlib.h> int main(){ char str[20] = {0}; int i; for(i=0; i<10; i++){ *(str+i) = 97+i; // 97為字符a的ASCII碼值 } printf("%s\n", str); printf("%s\n", str+2); printf("%c\n", str[2]); printf("%c\n", (str+2)[2]); return 0; }
運行結(jié)果:
abcdefghij
cdefghij
c
e
第5行代碼用來將字符數(shù)組中的所有元素都初始化為\0,這樣在循環(huán)結(jié)束時就無需添加字符串結(jié)束標(biāo)志。
前面三個 printf() 比較容易理解,第四個 printf() 可以參照上面的說明 3),str+2 表示指向第 2 個元素,(str+2)[2] 相當(dāng)于 *(str+2+2),也就是取得第 4 個元素的值。
到此這篇關(guān)于詳解C語言數(shù)組靈活多變的訪問形式的文章就介紹到這了,更多相關(guān)C語言數(shù)組訪問形式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++基于boost asio實現(xiàn)sync tcp server通信流程詳解
這篇文章主要介紹了C++基于boost asio實現(xiàn)sync tcp server通信的流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07詳談C++ socket網(wǎng)絡(luò)編程實例(2)
這篇文章主要為大家介紹了C++ socket網(wǎng)絡(luò)編程實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-11-11解析在main函數(shù)之前調(diào)用函數(shù)以及對設(shè)計的作用詳解
本篇文章是對在main函數(shù)之前調(diào)用函數(shù)以及對設(shè)計的作用進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05