C語言難點總結

2021-09-26 05:59:45 字數 2919 閱讀 4217

1,*與++結合

char str[20]="123456789";

char* p =str;

char c1 = *p++; //c1為字元 1

*p++解析:

*與++運算子 優先順序同級,此優先順序 結合方向 從右到左 。

所以先++,後*;後自增,先用乙個副本取出p的值,再自增,

然後*作用到副本上,取出值為1。

*++p 編譯是沒有錯誤的

+(加)與《結合

1<<3是1向左移3位,結果是8,不是3向左移1位。

同樣3>>1是3向右移1位,結果是1。

+的優先順序高於<

3,指標變數,函式指標

int** p;int與*的結合性從右到左,所以,先是*p,說明p是乙個指標,繼續往左看,又乙個*,說明指向的東西是指標,什麼樣的指標呢,int型的。ok~

int* a[5];的優先順序高於int與*,說明a是乙個陣列,陣列裡東西是什麼,指標,什麼樣的指標,int型的。ok~

int (*a)[5];首先a和*結合(由里到外),說明a是乙個指標,什麼樣的指標呢,指向陣列(優先順序高於int),什麼樣的陣列,int型的。ok~

int* fun(double ); ()優先順序高,所以fun是乙個函式,引數double 型,返回指標,什麼樣的指標,int型的。ok~

int (*fun)(double);fun先於*結合,fun是乙個指標,指向什麼呢,右邊()優先順序高,說明指向函式,函式引數double型,返回int。ok~。

typedef int (*fun)(double); fun fun1;

4,extern與extern 「c」

extern修飾乙個變數就代表這個變數是「外部」的,外部可理解為外部檔案中的。比如a.cpp中定義乙個全域性int g_a;b.cpp中是無法訪問此變數的,有編譯錯誤如下:error c2065: a未宣告的識別符號。

a.h中 有全域性int g_a,b.cpp中#include 「a.h」,再在b.cpp中extern int g_a;會報重定義的錯誤,但是你要知道,這裡與b.cpp中的extern int g_a;並沒有關係,而是a.h中存在乙份int g_a;在#include之後,b.cpp中又有乙份int g_a,自然會報 重定義編譯錯誤。所以通常是在a.cpp中定義int g_a;

各種情況對應如下,應總結經驗

(1)變數

main.cpp

a.cpp

編譯情況

int a;

int a;

「int a」已經在main.cpp中定義

int a = 0;

int a;

「int a」已經在main.cpp中定義

int a;

int a = 0;

「int a」已經在main.cpp中定義

int a = 0;

int a= 0;

「int a」已經在main.cpp中定義

extern int a = 0;

int a= 0;

「int a」已經在main.cpp中定義

int a = 0;

extern int a= 0;

「int a」已經在main.cpp中定義

extern int a = 0;

extern int a= 0;

「int a」已經在main.cpp中定義

extern int a ;

extern int a;

無法解析的外部符號「int a」

extern int a =0;

extern int a;

不報錯extern int a ;

extern int a=0;

不報錯extern int a =0;

int a;

「int a」已經在main.cpp中定義

extern int a ;

int a;

不報錯extern int a ;

int a = 0;

不報錯int a ;

extern int a =0;

「int a」已經在main.cpp中定義

int a ;

extern int a ;

不報錯int a = 0;

extern int a;

不報錯函式 

函式也有宣告和定義,

但由於函式的宣告和定義是有區別的,函式的定義是有函式體的,所以函式的宣告和定義都可以將extern省略掉,反正其他檔案也是知道這個函式是在其他地方定義的。

1.c**呼叫c++dll

編譯c++dll的要點

供c呼叫的c++的函式介面不能包含c++特有的東西。

在編譯生成供c**呼叫的dll時,標頭檔案的中的函式宣告前要加上extern 「c」 告訴編譯器按照c規範處理函式名。

編譯完成後,提供給c使用的標頭檔案裡面不能包含extern 「c」,可以使用巨集開關解決,也可以重新寫個頭檔案。

c**呼叫c++dll的要點

和正常呼叫c函式一樣

2.c++呼叫c語言dll

編譯c預言 dll的要點

c語言dll正常編寫,不需要做額外處理

c++呼叫c語言dll的要點

在包含c的標頭檔案或宣告來自c的函式時需要加上extern "c", 建議這麼做

c呼叫c dll

這個直接生成dll,直接呼叫即可

c++呼叫c++ dll

c++ dll為了讓c呼叫,新增了extern 「c」,c++呼叫的時候既可以新增external 「c」,也可以不新增。好神奇。

C語言的難點

c語言中static的作用 1 修飾變數,變數分為區域性變數和全域性變數,它們在記憶體的靜態區。靜態全域性變數,作用域僅限於變數定義的檔案中,其他檔案即使用extern宣告也無法使用。作用域從定義之處開始,到檔案結尾處。靜態區域性變數,在函式體中定義,就只能在這個函式中使用,同一文件的其他函式也使用...

c語言難點 指標篇

相信有很多小夥伴們都入過坑,其實吧,只要多看幾遍,大家都應該能理解,但是呢?我在這裡直接給你們省去了多看幾遍的步驟,如果覺得我寫的不錯的話,點讚收藏一下,如果能給我一點鼓勵的話 算了,我會害羞的,哈哈!廢話不多說,指標呢其實就是乙個資料型別,你把它跟其它型別一樣理解就行了,那麼它所定義的變數跟一般的...

C 重難點知識總結

c 提供了兩種指標運算子,一種是取位址運算子 一種是間接定址運算子 指標是乙個包含了另乙個變數位址的變數,可以把乙個包含了另乙個變數位址的變數說成是 指向 另乙個變數。變數可以是任意的資料型別,包括物件 結構或者指標。取位址運算子 是一元運算子,返回運算元的記憶體位址。例如,如果 var 是乙個整型...