- 传送门:博客汇总帖
1、函数指针 与 指针函数
- 函数指针:是一个指针,函数是修饰,这是一个指向函数的指针
- 指针函数:是一个函数,指针是修饰,返回值是指针的函数
1.1 指针函数
就这种,返回值为指针的函数。⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣
char * fun(int a)
1.2 函数指针
指向函数的指针
- 普通类型
/*
* @Author: Mr.Dragon
* @Date: 2021-09-20 18:32:35
* @LastEditTime: 2021-09-20 18:43:17
* @LastEditors: Mr.Dragon
* @Description: Fall_down:所念皆星河
*/
#include "stdio.h"
int MAX(int a,int b)
{
return a>b?a:b;
}
int main(void)
{
int (*p)(int,int);
p = MAX;
printf("%d",(*p)(5,2));
return 0;
}
- typedef类型
/*
* @Author: Mr.Dragon
* @Date: 2021-09-20 18:32:35
* @LastEditTime: 2021-09-20 19:09:31
* @LastEditors: Mr.Dragon
* @Description: Fall_down:所念皆星河
*/
#include "stdio.h"
typedef int (*Fun)(int,int);
int MAX(int a,int b)
{
return a>b?a:b;
}
int MIN(int a,int b)
{
return a>b?b:a;
}
int main(void)
{
Fun CompareFun;
CompareFun = MAX;
printf("MAX:%d\n",(*CompareFun)(5,2));
CompareFun = MIN;
printf("MIN:%d\n",(*CompareFun)(5,2));
return 0;
}
2、指针数组 与 数组指针
- 指针数组:是一个数组,指针是修饰,数组元素为指针类型
- 数组指针:是一个指针,数组是修饰,指向数组的指针
2.1 指针数组
/*
* @Author: Mr.Dragon
* @Date: 2021-09-20 19:14:54
* @LastEditTime: 2021-09-20 19:17:11
* @LastEditors: Mr.Dragon
* @Description: Fall_down:所念皆星河
*/
#include "stdio.h"
char * StrBuff[]={
"a",
"b",
"c",
};
int main(void)
{
for (size_t i = 0; i < sizeof(StrBuff)/sizeof(StrBuff[0]); i++)
{
printf("%s\n",*( StrBuff + i));
/* code */
}
return 0;
}
2.2 数组指针
/*
* @Author: Mr.Dragon
* @Date: 2021-09-20 19:19:55
* @LastEditTime: 2021-09-20 19:35:15
* @LastEditors: Mr.Dragon
* @Description: Fall_down:所念皆星河
*/
#include "stdio.h"
int main()
{
/**
* @description: 用数组指针遍历数组
* @param {*} 二维数组名特点:1、加一移动一行 2、地址常量(行地址)
*/
int a[3][2] = {{1,2},{3,4},{5,6}};
int (*p)[2];
static int i,j
p = a;
printf("%p %p\n",a,a+1); //移动一行 a和p相同
printf("%p %p\n",p,p+1); //移动一行
printf("%d %d %d %d\n",a[1][1],p[1][1],*(*(a+1)+1),*(*(p+1)+1));
printf("%d %d\n",*(*a),*(*a+1));
for ( i = 0; i < 3; i++)
{
for ( j = 0; j < 2; j++)
{
printf("%d %d %d %d | ",a[i][j],p[i][j],*(*(p+i)+j),*(*(a+i)+j));
/* code */
}
/* code */
}
}
3、大小端模式
- 小端模式:低字节在低地址,高字节在高地址
- 大端模式:高字节在低地址,低字节在高地址
3.1 确定大小端模式(联合体(共用体))
#include "stdio.h"
union mode
{
int num;
char i;
/* data */
};
char DetermineEnd(void)
{
union mode sue;
sue.num = 1;
return sue.i;
}
int main(void)
{
if (DetermineEnd() == 1)
{
printf("小端模式");
/* code */
}
else
{
printf("大端模式");
}
return 0;
}
联合体有一个特性就是所有成员共用一块内存,所以在这段代码中定义了一个联合体,定义了两个成员,一个是int型(4Byte),一个是char型(1Byte),正因为联合体所有成员共用一块内存,所有成员起始地址相同,所以给int型变量赋值1,当测试的机器是小端模式,那么低字节在低地址,那么1就在起始位置(联合体的起始,也就是所有成员的起始位置),当测试的机器是大端模式,那么低字节在高位,也就是1在高位。
4、堆栈生长方向
一般说堆栈,特指栈。
堆栈的生长方向从最本质的理解是堆栈入栈方向是从高地址向低地址增长还是低地址向高地址增长。
- 向上增长(正向增长、向上生长):低地址 向 高地址生长
- 向下增长(逆向增长、向下生长):高地址 向 低地址生长