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 是乙個整型...