參考:《c專家程式設計》
程式中所有的變數名或者陣列名在重定位之後都只是乙個位址值而已,所有引用這些變數的地方都會被替換成乙個位址值。
char a =
"shakalaka"
;a =
0x1111cc
;//非法
char
* p = a;
//定義了乙個指標變數,這個指標變數佔據8個位元組的空間(64位的系統)並且使用a的值初始化p。p也可以指向其他位址
p =0x74cc
;//合法
p[1]
的方式訪問資料過程(程式重定位之後p也是乙個位址值)
從上面可以看出來使用指標的方式引用內容會多出取位址這一步。有點類似間接定址的味道
##定義成陣列,宣告成指標
extern
char
* p;
char p=
"abcdef"
;// private.c
#include
"some.h"p[1
]='s';
這時候,對p[1]的解釋方法和宣告時的型別保持一致,即間接的形式
顯然,這不是我們期待的
const char* a = "hello";//c/c++都能編譯成功
char *na = "hello";//c編譯成功,c++產生warning
char b = "hello";//c/c++都能編譯通過
a[1] = 'a';//語法上是正確的,但是會報錯
b[0]='a';//正確執行
"blingbling"[0] = 'a';//錯誤
void foo(char a);
void bar(char *a);
int main()
}
char
*text =
"test"
;//c可以編譯通過,c++會產生warning
因此,下面兩種定義方式都能編譯成功,但是背後原理不一樣
char a = "abcdr";// 編譯器開開闢一塊空間將其初始化,相當於呼叫拷貝建構函式之後a是乙個可以修改的陣列
char * b = "yes";// b是乙個指向rodata的指標!!!在c++中會報錯的
void foo(char a)
void foo_const(const char a)
}int main()
const char * a = "i love china";
cout<(a);//c++ stytle
指標字串和陣列指標
指標是c語言的精髓,只有掌握好指標才算是真正學會了c語言,以下就是學習指標的例子 include main int n 5 sort name,n print name,n if strcmp1 name 0 name 1 0 printf s,s n name 0 name 1 if strcmp...
C 指標和陣列 字元和字串 字元陣列
char ch 24 字元陣列初始化時,如果使用者未顯示新增 0 編譯器會自動加上,以表示字串結束。所以上面的初始化就相當於 char ch 24 除了用上述的方式來初始化乙個字元陣列,還可以用下面的方式 char ch today is a beautiful day char ch char p...
字元陣列,字元指標,字串常量
一 字串可以賦值給字元指標變數 char p hello 其實這裡分配了常量,即const,如果不讓p指向別的位址就無法修改。char q world cout p q 1.字串常量 hello 出現在乙個表示式中時,hello 表示式使用的值就是這些字元所儲存的位址 在常量區 而不是這些字元本身。...