C语言中指针算很重要的一部分 是C的灵魂
指针是指示一个内存地址的变量 一般指向一个函数 或者变量 使用一个指针时 程序既可以直接使用这指针所孙处的内存地址 又可以使用地址所存储的函数的值
内存是按照顺序编号的一系列存储单元
例 1:
int num = 100;//定义一个变量
printf("%x",&num);//获取变量的内存地址
int *p = #//定义一个指针变量*p 然后为*p的valuse赋值 为num的地址 指针的必须赋值
printf("\n*p=%d p=%x &num=%x",*p,p,&num);//*p就是获取指针的VALUE所对应的内容 *取内容 赋值之后的P=&num
getchar();
总结 1:& 取地址 2:*取内容 3:指针其实就是一个变量 他的类型是指针类型 4:指针必须定义一个类型 因为每个类型 所占的内存不同 长度不同
例2 读取 操作 别人程序的变量
C语言原则上来说 A程序无法访问B程序的内存 但是我们可以通过注射一个dll 来达到访问内存的目的
可以先通过 onlydeg 等工具找到别人变量的内存地址
之后
_declspec(dllexport) void go()
{
int *p = (int *)0x58fbc4;
*p = 500;
}
通过强转 导出DLL文件 注入别人程序 这样就可以改变数据了
总结:指针不能非法访问别的进程的数据
例3 a,b,c 3个数据 要求不改变数据本身值的情况下对 ABC 3个数字进行排序显示
//交换数据
void swap(int *a,int *b,int *c)
{
int *p;
printf("%d--%d---%d", *a, *b, *c);
if (*a>*b)
{
p = a;
a = b;
b = p;
}
if (*a>*c)
{
p = a;
a = c;
c = p;
}
if (*b>*c)
{
p = b;
b = c;
c = p;
}
printf("\n%d--%d---%d",*a,*b,*c);
}
void main()
{
int a = 10, b = 50, c = 1;
swap(&a, &b, &c);
getchar();
}
总结 :指针他只是交换了他们的引用 交换了指针类型本身的value 并不是值 所以在这里仅仅交换引用 并没有起到叫魂 abc 3个值的作用