Day04_C语言基础数据结构重点复习笔记20250618
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;
}