C語言 指標練習 2

2021-08-30 04:39:38 字數 1980 閱讀 5840

int main()

輸出結果:ff ff ff fc;-4

分析:

int main()

; int *ptr1 = (int*)(&aa + 1);

int *ptr2 = (int*)(*(aa + 1));

printf("%d %d", *(ptr1 - 1), *(ptr2 - 1));

return 0;

}

輸出結果:10 ; 5

分析:&aa,取的是二維陣列的位址,加1,跳過整個陣列,指向了10的後面,賦給ptr1,相當於ptr1指向了10的後面,ptr1-1再解引用,整形指標減1,向前挪動4個位元組,解引用後拿出10;陣列名是首元素位址,但是aa是二維陣列,所以首元素位址就是第一行的位址,加1向後跳過了一行,也就是指向了第二行的位址,第二行的位址解引用,就是aa[1],也是第二行的陣列名,它又相當於第二行首元素的位址,也就是讓ptr2指向了6,ptr2-1,向前挪動乙個整形,解引用,訪問的就是5.

(*(void(*)())0)();
怎麼理解這句**?

分析:我們希望0是某個函式的位址,所以把它強制型別轉換為函式的指標型別,這個時候它就是個函式位址了,在前面加個*,表示解引用操作,找到這個函式,後面去呼叫它,呼叫的時候,因為函式無參,所以不用傳引數。這是分析過程,那麼具體如何描述呢?

答:呼叫0位址處的函式,呼叫的函式的引數是無參,返回型別為void,還要解釋的話,可以這樣說:把0強制型別轉換為函式的指標型別,解引用,去找到這個函式,並呼叫該函式,調的函式沒有引數,返回型別為void。

void(*signal(int, void(*)(int)))(int);
怎麼理解這句**呢?

分析:分析這種複雜的**,首先,我們得找到乙個名字或者乙個符號開始,這個**呢,就從signal開始,這是函式,而且是函式宣告,不是函式呼叫,為什麼這樣說呢?呼叫函式有傳參,但是這裡面沒傳參,有的人可能會說傳的是int,但是傳int時,也只能傳1,2,3,或者其他整形數字,不可能會傳int過去,所以這絕對不是乙個函式的呼叫,而是乙個函式的宣告,它的引數為int和函式指標,返回型別為函式指標。

void (*signal(int,void(*)(int)))(int);
signal(int,void(*)(int))就是函式名和函式引數,去掉signal(int,void(*)(int))之後,剩下的就是函式的返回型別void (*)(int),所以它返回的是乙個函式指標,該指標指向函式的引數是int,返回型別為void。

不過,我們理解的的寫法應該是:

void(*)(int) signal(int,void(*)(int));
但是實際上並不這樣寫。這個**太複雜,我們寫的**應該是讓別人讀得懂的,所以可以使用 typedef 把它簡化一下:

typedef void(*ptr_t)(int);

ptr_t signal(int,ptr_t);

分析了這麼多,這段**具體應該這樣解釋:

signal是乙個函式宣告,函式的引數為int和乙個函式指標,該函式指標指向的函式引數為int,返回型別為void;signal函式的返回型別也為函式指標,該函式指標指向的函式引數為int,返回型別為void。

#include int main()

; char** pa = a;

pa++;

printf("%s\n", *pa);

return 0;

}

輸出結果:"at"

分析:

C語言指標練習

總時間限制 1000ms 記憶體限制 65536kb 在此處補充你的 描述 填寫記憶體交換函式 swapmemory,使得程式輸出指定結果 include using namespace std void swapmemory void m1,void m2,int size void printi...

C語言指標練習

include 函式作用 將指標傳入,連續輸出len個位元組其中的內容 返回引數 無 void pointer output char buf,char len 傳入宣告只能傳入char型別的指標 函式作用 將傳入的值遞減傳入陣列內 傳入引數 無符號整形 char itoa unsigned cha...

C語言程式設計(練習2 陣列和指標)

題目 編寫程式,把下面的資料輸入乙個二維陣列中。25 36 78 13 12 26 88 93 75 18 22 32 56 44 36 58 然後執行以下操作 輸出矩陣兩個對角線上的數 分別輸出各行和各列的和 交換第一行和第三行的位置 交換第二列和第四列的位置 輸出處理後的陣列 實現 編寫程式,把...