一、c語言指標學習架構
1.基本資料型別---指標
2.字串---指標
6.共用體---指標
7.列舉---指標
8.位域---指標
9,常量---指標
10.變數---指標
二、c語言中的void與null
//void真正發揮的作用在於:
//(1) 對函式返回的限定;
//(2) 對函式引數的限定
// (3)void不能代表乙個真實的變數, 凡是試圖用它去表示真值得做法都是不合法的
//void的出現只是為了一種抽象的需要,如果你正確地理解了物件導向中「抽象基類」的概念,也很容易理解void資料型別。
//正如不能給抽象基類定義乙個例項,我們也不能定義乙個void(讓我們模擬的稱void為「抽象資料型別」)變數。
#include
#include
#define arrsize 87
int main()
;int intarray2[arrsize] = ;
memset(intarray1, 0, arrsize*sizeof(int));
printf("intarray1[2] = %d\n", intarray1[2]);
memcpy(intarray2, intarray1, arrsize*sizeof(int));
printf("intarra2[2] = %d\n", intarray2[2]);
float intarray3[arrsize] = ;
float intarray4[arrsize] = ;
memset(intarray3, 0, arrsize*sizeof(int));
printf("intarray3[2] = %f\n", intarray3[2]);
memcpy(intarray4, intarray3, arrsize*sizeof(int));
printf("intarray4[2] = %f\n", intarray4[2]);
//對於指標如果暫時沒有合適的初始化值,就應該把它置為null(0)。
int *p = null;
printf("&p = %p\n", &p); //邏輯位址為0x00000000,不可訪問,會出現段錯誤,只適用於指標初始化未能賦值時使用。
printf("pvoid = %d, &pvoid = %p; pint = %d, &pint = %p\n", pvoid, &pvoid, pint, &pint);
(char *)pvoid++; //ansi, gnu,all right!
printf("pvoid = %d, &pvoid = %p; pint = %d, &pint = %p\n", pvoid, &pvoid, pint, &pint);
return 0;
}#include
int main()
三、c語言常量大全
int main()
;//五、常量與指標
//1,指標常量
int a = 1;
int *const b = &a;
//const 修飾 b, b-->唯讀,但*b未被修飾故可讀可寫.
//const位於*右側,表明物件是常量,內容為指標(位址)
//宣告常量b,它的值是變數a的位址
*b = 20;
printf("b = %p, *b = %d\n", b, *b);
//2,常量指標
int c = 39;
const int *d = &c;
// const 修飾的是*d,*d-->唯讀,但d未被修飾故可讀可寫
d = b;
printf("d = %p, *d = %d\n", d, *d);
//int strcmp(const char *str1, const char *str2);
//因為函式的引數宣告用了常量指標的形式,就保證了在函式內部,
//那個常量不被更改。
//也就是說,對str1和str2的內容更改的操作在函式內部是不被允許的
//但是可以對他們的位址進行操作(間接的對他們進行(整體的操作))
//3,指標常量的指標常量
const int * const e = &a; //此時e或者*e均為常量,e,*e-->唯讀
//六、常量與字串(字元陣列)
char* ptr1 = "abc"; //"abc" 是常量
//因為定義的是乙個普通指標,並沒有定義空間來存放"abc",
//所以編譯器得幫我們找地方來放"abc",
//顯然,把這裡的"abc"當成常量並把它放到程式的常量區是編譯器最合適的選擇 //所以儘管ptr的型別不是const char*,
//並且ptr[0] = 'x';也能編譯通過,
//!!!但是執行ptr[0] = 'x';就會發生執行時異常,
//因為這個語句試圖去修改程式常量區中的東西。
//這種寫法原來在c++標準中是不允許的,
//但是因為這種寫法在c中實在是太多了,
//為了相容c,不允許也得允許。雖然允許,
//但是建議的寫法應該是
const char* ptr = "abc";
//這樣如果後面寫ptr[0] = 'x'的話編譯器就不會讓它編譯通過,
//也就避免了上面說的執行時異常。
//如果char* ptr = "abc";寫在函式體內,那麼雖然這裡的"abc\0"被
//放在常量區中,但是ptr本身只是乙個普通的指標變數,
//所以ptr是被放在棧上的, 只不過是它所指向的東西被放在常量區罷了
//字串常量的型別可以理解為相應字元常量陣列的型別,
// 如"abcdef"的型別就可以看成是const char[7]""
char *str = "this is a special string";
char string[ ]="this is a string";
//字元指標str與字元陣列string的區別是:
//str是變數,可改變str使它指向不同的字串,但不能改變str所指的字串常量
//string是乙個陣列,可以改變陣列中儲存的內容。
//字串本身就可以代表他們的位址
//七、字元陣列與函式陣列傳參
char str = "abcdef"; //就有sizeof(str) == 7,因為str的型別是char[7],
sizeof("abcdef") == 7; //因為"abcdef"的型別是const char[7]。
char *ptr = "abcdef"; //就有sizeof(ptr) == 4,因為ptr的型別是char*。
char str2[10] = "abcdef"; //就有sizeof(str2) == 10,str2的型別是char[10]
void func(char sa[100],int ia[20],char *p)
// 就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4;
// 因為sa的型別是char*,ia的型別是int*,p的型別是char*
return 0;
}---------------------
四、c語言變數總結
int main()
---------------------
c語言 知識點
遞迴方法 遞迴相比迴圈時間上快些,但是 遞迴比較占用空間,如果遞迴的次數超過十萬次後會導致資源占用完畢 標準的 優化技巧 消除迴圈 函式迴圈 函式 就地擴充套件 公共子表示式消除 改進暫存器分配 省略執行時對陣列邊界的檢查 迴圈不變數 移動 操作符長度消減 把指數操作符轉變為乘法操作 把乘法操作變為...
c語言知識點
2019 3 4 typedef void voidp 等同於typedef void voidp voidp a a null 即定義了乙個可以指向任何型別的指標 typedef voidpf zallback open file func of voidpf opeaque,const char...
c語言知識點
關於 va args define debug level,format,if level g printlevel else 這裡的 va args 表示可變引數,即上面.傳遞進來的多個引數,是當傳入引數為0時,去掉前面,防止編譯出錯 的另乙個用法如 define xname n x n,那xna...