C語言深度剖析自測題8解析

2022-05-10 14:38:19 字數 1026 閱讀 3325

#include

int  main(void) ;

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

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

printf("%x, %x\n", ptr1[-1], *ptr2);

這個題目主要是考了兩個知識點乙個是指標的知識,第二個是大端機和小端機的知識

首先需要明確x86是小端機,所以它的數值在各個位元組中的順序是從小到大的

比如對於int型的數值其在記憶體中的編碼就是 1 0 0 0

在解釋清楚這一點後,正式的解析下這道題目

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

&a 對陣列名進行取位址,陣列名所代表的是乙個有5個int元素的陣列,所以&a代表的就是乙個代表有五個元素的陣列的指標

所以這裡的(&a + 1)實際上就是取得了a[4]也就是數字5後面的位址,這樣又將其轉換為乙個int*指標,此時的ptr1就是乙個指向

a[5]後位址的int型指標,ptr1[-1]其實就等價於*(ptr1-1)這樣的運算,所以ptr1-1得到的就是a[4]的位址所以得出的第乙個值就是a[4]的值

也就是5.

接下來再對第二個指標進行分析,(int)將乙個指標值轉換為了int值,(int)a+1就是a的位址值加上1,a是int*型別的所以a+1的話其值實際上

了4,而現在將a轉換為int型的所以這樣就相當於給其值加上1,這個的作用效果和(char*)a + 1是相同的.然後這裡又將該值轉換為乙個int*型別

的指標,所以當使用*ptr2的時候就會取四個位元組,並讀取出其中的值.

因為是小端機所以1在4個位元組中的分布是0x01 0x00 0x00 0x00, 2在4個位元組中的分布是 0x02 0x00 0x00 0x00

此時ptr2指向的是a中的第二個位元組所在的位址,所以當取4個位元組時實際取到的是 0x00 0x00 0x00 0x02這樣當將其解發布真是的值實際是

0x02 0x00 0x00 0x00 這裡的輸出使用的是%x所以輸出的是十六進製制的數字,所以輸出了2000000.

C語言深度剖析自測題8解析

include int main void int ptr1 int a 1 int ptr2 int int a 1 printf x,x n ptr1 1 ptr2 這個題目主要是考了兩個知識點乙個是指標的知識,第二個是大端機和小端機的知識 首先需要明確x86是小端機,所以它的數值在各個位元組中...

Python基礎自測題答案解析

單選題 選a。python函式必須有引數,通常由形式引數和實際引數構成,例如 def myfunction name print name myfunction 生魚片 生魚片 選b。注意這裡的v是大寫。選b。python中的識別符號不能以數字開頭。選d。2f保留兩位有效數字。選d。python是一...

C語言深度剖析

c語言深度剖析 1,編譯器通常不為普通const唯讀變數分配儲存空間,而是將他們儲存在符號表中,使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率更高。2,const int p p可變,p指向的物件不變。int const p p可變,p指向的物件不可變 int const p ...