指针,别名

最近一直在读《linux c 程序设计大全》(吴岳),收获颇丰啊。

一,指针与别名

直接上代码,代码一

void f1(int*p,int*q)

{

*p=2**q;

}

代码二,

void f2(int*p,int*q)

{

*p+=*q;

*p+=*q;

}

这两段代码当然是第一个的效率高,代码一访问两次存储器,代码二访问四次存储器。不过这只是题外话^O^,真正要说的是这里面的陷阱。假设p指向a(a=3),q指向b(b=3),调用这两个函数的得到的功能一样,都变成了9,但是如果p和q同时指向a(a=3),这时调用f1,a变成了9,调用f2,则a变成了12!

二,

数组的指针,依然直接看代码

#include<stdio.h>
int main()
{
int (*p)[5];
int a[5]={1,2,3,4,5};
p=&a;
int*ptr;
ptr=(int *)(p+1);
printf("%d\n",*(ptr-1));
}
这里的执行结果是什么呢?首先p是一个数组指针指向一个5*sizeof(int)大小的数组,因此,p+1使得指针移动了20个字节!所以,*(ptr-1)的值为5!

三,杂项总结

1,NULL表示为一个空指针其定义在stdio.h中,如下:#define NULL (void*) 0,空指针实际上代表0号内存单元,在所有系统中0号内存单元是不允许进行读写操作的,一次指向该内存的指针作为空指针之用。之所以定义为(void*)0,而不直接定义为0是为了避免编译器作无用的检查。


原文地址:https://www.cnblogs.com/ymy124/p/2295227.html