C語言若干知識點歸記

2022-03-17 20:27:45 字數 3711 閱讀 9037

一、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...