1.什么是計算機的大小端存儲?
答:大端是數據的高位字節存儲在低地址,低位字節存儲在高地址,網絡協議(如TCP/IP)通常采用大端序(稱為“網絡字節序”)。例如:32位整數 0x12345678 在內存中的存儲(地址從左到右遞增):
地址:0x100 ?0x101 ?0x102 ?0x103
數據: 12 ? ? ? 34 ? ? ? ?56 ? ? ? ?78
數據的低位字節存儲在低地址,高位字節存儲在高地址。x86、ARM等常見CPU默認采用小端序。32位整數 同一整數 0x12345678 在小端下的存儲:地址:0x100 ?0x101 ?0x102 ?0x103
數據: 78 ? ? ? ?56 ? ? ? ?34 ? ? ? ? 122.如何判斷大小端存儲?(如何分辨如上圖所示)
int a = 0x12345678; char *p = &a; if(*p==0x78){printf("小端存儲\n");}else{printf("大端存儲\n")}char c = (char)a; if(c==0x78){printf("小端存儲\n");}else{printf("大端存儲\n")}union A {int n1;short n2; }a1; a1.n1 = 0x01345601; if(a1.n2==0x5601){printf("小端存儲\n");}else{printf("大端存儲\n")}union {int a;long int b;char str[13]; }; //16
3.arr和&arr的區別
01.&arr 表示整個數組的地址,它的類型是指向整個數組的指針。盡管 &arr 和 arr 的數值相同,但它們的類型不同,指針運算的步長也不同。
02.&arr 和 arr 的數值相同,都指向數組起始位置。
arr + 1 是指向下一個元素的地址,由于 int 類型通常占 4 字節,所以地址偏移 4 字節。
&arr + 1 是指向下一個同類型數組的地址,偏移量是整個數組的大小,即 5 * 4 = 20 字節。arr是數組的首地址,需要用一級指針指向
&arr是整個數組的地址,需要用二級指針指向
4.解釋數組指針、指針數組、函數指針和指針函數的區別
01:數組指針
定義:數組指針是指向數組的指針,它指向的是一個數組,其類型是指向特定類型和長度數組的指針。
語法:type (*ptr)[size];,其中 type 是數組元素的類型,size 是數組的長度,ptr 是數組指針變量名。解釋:ptr 是一個數組指針,指向 arr 數組。使用 (*ptr)[i] 來訪問數組元素,*ptr 先解引用得到數組,再通過 [i] 訪問對應元素。
02.指針數組
定義:指針數組是一個數組,數組中的每個元素都是指針。
語法:type *arr[size];,其中 type 是指針指向的數據類型,size 是數組的長度,arr 是指針數組名。解釋:ptr_arr 是一個指針數組,數組中的每個元素都是 int 類型的指針,分別指向 a、b、c 變量。通過 *ptr_arr[i] 解引用指針訪問對應變量的值。
03.函數指針
定義:函數指針是指向函數的指針,它存儲的是函數的入口地址,可以通過函數指針調用函數。
語法:return_type (*ptr)(parameter_list);,其中 return_type 是函數的返回類型,parameter_list 是函數的參數列表,ptr 是函數指針變量名。
解釋:func_ptr 是一個函數指針,指向 add 函數。可以像調用普通函數一樣使用 func_ptr(3, 4) 來調用 add 函數。04.指針函數
定義:指針函數是返回指針的函數,即函數的返回值是一個指針。
語法:type *func_name(parameter_list);,其中 type 是指針指向的數據類型,func_name 是函數名,parameter_list 是函數的參數列表。
解釋:get_array 是一個指針函數,返回一個指向 int 數組的指針。在 main 函數中接收該指針并通過它訪問數組元素。數組指針:本質是指針,指向一個數組。
指針數組:本質是數組,數組元素為指針。
函數指針:本質是指針,指向一個函數。
指針函數:本質是函數,返回值為指針。
5.char str[]="hello\01"; printf("strlen(str)");的結果
輸入結果為:6
解析:
在字符數組 str 中,字符依次為 'h'、'e'、'l'、'l'、'o'、'\01',接著是字符串結束符 '\0'。由于 \01 并非字符串結束符,strlen 函數會把它當作普通字符計數。所以,str 中有效字符有 6 個,strlen(str) 的結果為 6。
6.猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求原來它一共摘了多少個桃子。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fun(int n)
{ if(n==10){return 1;}return (fun(n+1)+1)*2;}
int main(int argc, const char *argv[])
{printf("猴子原來一共摘了%d個桃子\n",fun(1));return 0;
}