1、函数指针 与 指针函数
1.1 指针函数
就这种,返回值为指针的函数。?????????????????????
char * fun(int a)
1.2 函数指针
指向函数的指针
#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;
}
#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 指针数组
#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));
}
return 0;
}
2.2 数组指针
#include "stdio.h"
int main()
{
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);
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));
}
}
}
3、大小端模式
- 小端模式:低字节在低地址,高字节在高地址
- 大端模式:高字节在低地址,低字节在高地址
3.1 确定大小端模式(联合体(共用体))
#include "stdio.h"
union mode
{
int num;
char i;
};
char DetermineEnd(void)
{
union mode sue;
sue.num = 1;
return sue.i;
}
int main(void)
{
if (DetermineEnd() == 1)
{
printf("小端模式");
}
else
{
printf("大端模式");
}
return 0;
}
联合体有一个特性就是所有成员共用一块内存,所以在这段代码中定义了一个联合体,定义了两个成员,一个是int型(4Byte),一个是char型(1Byte),正因为联合体所有成员共用一块内存,所有成员起始地址相同,所以给int型变量赋值1,当测试的机器是小端模式,那么低字节在低地址,那么1就在起始位置(联合体的起始,也就是所有成员的起始位置),当测试的机器是大端模式,那么低字节在高位,也就是1在高位。
4、堆栈生长方向
一般说堆栈,特指栈。
堆栈的生长方向从最本质的理解是堆栈入栈方向是从高地址向低地址增长还是低地址向高地址增长。
- 向上增长(正向增长、向上生长):低地址 向 高地址生长
- 向下增长(逆向增长、向下生长):高地址 向 低地址生长
|