char *p = “helloworld”;
在這里p是一個變量,其類型為指針類型,并且指向一個字符串,字符串內容為”helloworld”,如果要訪問p[2]的話,就需要先從p中取出地址,該地址為”helloworld”的首地址,然后再加上偏移量2,就得到了’l’這個字符,所以其訪問的方式為先從p中取出地址,然后再將該地址加上偏移量,得到一個地址,最后從這個地址中取出值來。其分為三步:
1.取p的值,該值即為字符串的首地址;
2.該地址加上偏移量,得到所要取的字符的地址;
3.從這個地址中取得值。
此處p是一個變量,它自己是存放在一個地址中的,而它的內容則是”helloworld”這個字符串的地址. p與字符串是分開的。
同時,該指針的值是動態確定的,必須在運行的時候才能確定其值,并通過該值訪問到字符串。
而如果是數組的話,則為
char p[20] = “helloworld”;
在這里p為一個字符串的標識,其類型是一個字符數組的類型,且該數組有20個char類型的大小.此時如果要訪問p[2]的話,分2步:
1.直接使用該字符數組的首地址加上2個char類型的大小的長度就得到了要訪問的字符的地址;
2.最后再從這個地址中取出值來.而且此時p的地址為該字符數組的首地址,其內容為’h’,一個字符類型。
所以在這個地方數組與指針是不相同的,因為此時數組取值的第一步并不是從p中讀取地址來再加上偏移量的.此時的p這個地址的值就為’h’這個字符,其類型為字符型而不是一個指針類型.此時p的地址與p[0]的地址是相同的。
同時,每個符號的地址在編譯時就確定了,所以這里p的地址就已經確定了,如果需要訪問p[2],則直接使用該地址加上2這個偏移量就可以取到這個值了.它不需要指令再取得這個首地址.而第一種情況下,還需要指令取得指針中的值,并通過這個值來訪問字符串。
一個直觀的看法就是前一種是兩個不同的, 而后一種則是在同一個里面。
另外,還有一個不同之處在于第一個情況下 p 指向的是一個常量區, 是不能改變的, 即不能夠對p[i]賦值, 而第二種情況下, p是一個字符數組, 其是可以改變的,可以對p[i]賦值的。
他們倆*p的值是一樣的,都是h字符!
新聞熱點
疑難解答