如何大端模式和小端模式 (函数)指针

实验判断计算机的大小端和数组,指针的一些注意事项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
short num = 1;
short num_2 = 8192;
char* p_ch = ((char*)(&num));
char* p_ch_2 = ((char*)(&num_2));
int main()
{
printf("%d\n",*p_ch);
printf("%d\n",0b0000000000000001);
printf("%d\n",*p_ch_2);
printf("%d\n",0b0010000000000000);

return 0;
}

分析

原理:利用了*char来取出shourt低地址一字节的数据。
(假设shourt是双字节,char是单字节

  1. 如果是小端模式:低地址保存低位数据

    • *p_ch 打印 1,因为1的低位一字节数据是0b0000001。
    • *p_ch_2 打印 0,因为8192的低位一字节数据是0b0000000。
  2. 如果是大端模式:低地址保存高位数据

    • *p_ch 打印 0,因为在大端模式下,1的高位一字节是0b0000000。

    • *p_ch_2 打印 32,因为在大端模式下,8192的高位一字节是0b001000。

一些指针事项

  • 指针+-整数 就是跳过几个该指针的类型。

  • 地址(指针)-地址(指针)的意义就是,差了几个元素——前提:两个指针指向同一个地址空间。

  • 我们可以通过指针算术来获得指向其他元素的指针,例如 arr + 1 指向 arr[1],并且指针算术和比较允许将指针与数组的结束位置进行比较,但不能和第一个元素之前的位置进行比较

    • 例如:
    1
    2
    3
    4
    for (int* p = arr; p < arr + 5; ++p) {
    printf("%d ", *p);//遍历数组
    /* 非法的比较 while (p >= arr - 1) 这种比较是无效的,因为指针不能指向第一个元素之前的位置*/
    }
  • 决定了指针进行解引用操作的时候,一次性访问几个字节,取决于指针的类型。

函数指针的使用

  1. 基础用法
    • 首先,定义函数
    • 然后根据函数的定义,完成函数指针的设置。
      函数返回类型 (*函数指针名)(参数类型, 参数类型)
    • 最后调用
  2. 函数指针数组
    函数返回类型 (*函数指针数组名[元素个数])(参数类型, 参数类型) = {函数名, 函数名, 函数名}
  3. 带参数的函数指针
    • 参考实验代码

实验代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
using namespace std;

void add(int a, int b) {
cout << "Addition: " << a + b << endl;
}

void subtract(int a, int b) {
cout << "Subtraction: " << a - b << endl;
}
void multiply(int a, int b) {
cout << "Multiplication: " << a * b << endl;
}
//--------------正常使用----------------//
//设置函数指针属性
void (*funcPtr)(int, int);

//--------------函数指针作为参数----------------//
void executeOperation(void (*funcPtr)(int, int), int a, int b) {
funcPtr(a, b);
}
//--------------函数指针数组----------------//
void (*funcPtrArr[3])(int, int) = {add, subtract, multiply};//设置函数指针数组


int main() {

funcPtr = &add;
//调用add
funcPtr(5, 3); //输出8
funcPtr = &subtract;
funcPtr(5, 3); // 调用subtract,输入2
//--------------函数指针数组----------------//
for (int i = 0; i < 3; ++i) {
funcPtrArr[i](10, 5);//分别调用对应的函数输出 15 ,5,50
}
//--------------函数指针作为参数----------------//
executeOperation(add, 10, 5); // 输出15
executeOperation(subtract, 10, 5); // 输出5
return 0;
}


如何大端模式和小端模式 (函数)指针
https://weihehe.top/2024/07/05/大端模式和小端模式/
作者
weihehe
发布于
2024年7月5日
许可协议