C语言复习—谈谈你理解的指针

指针

讲讲你理解的指针

什么是指针呢?
指针实质上就是地址,而地址是内存单元的编号(不能重复),所以说,一个变量可以有两个地址,但是两个变量不能存在同一块地址空间中。指针就是一个存放地址的变量。指针也有大小,在32位平台下是4个字节,在64位平台下是8个字节。指针相减运算求的是两块内存之间的地址差。
为什么要用指针?
1. 可以处理堆中存放的大型数据。
2. 可以以另一种方式向函数传参
3. 可以快速访问类中的数据成员与成员函数。

指针和引用的区别

  1. 引用必须初始化,指针不需要。
  2. 引用初始化之后不能被改变,指针可以改变所指的对象
  3. 指针可以指向空,但是不存在指向空值的引用。

指针和数组

  • 指针数组:这是一个数组,每个元素都是指针
    int *p[10]; //一个存放10个int*指针的数组
    int **p[10]; //一个存放10个int**指针的数组

    这里p+1表示p指向下一个数组元素。
    如果将一个二维数组赋给一个指针数组:
int *p[3]; 
int a[3][4]; 
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 
for(i=0;i<3;i++) 
p[i]=a[i] 
 //这里int *p[3] 表示一个一维数组内存放着三个指针变量
 //分别是p[0]、p[1]、p[2],所以要分别赋值。
  • 数组指针:是一个指针,该指针指向的是一个数组
    int (*p)[10]; //一个p指针,指向存放10个整型的数组
    这里p+1表示跳过这10个整型数据的长度,来到下一个空间。
    如果将一个二维数组赋值给一个指针:
int a[3][4];
 int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
 p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
 p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
  • 函数指针:指向函数的指针
    void (*func)() //*func指向一个返回类型为void,没有参数的函数
  • 函数指针数组:是一个数组,数组每个元素都是一个函数指针
    int (*p[])() //p先和[]结合,说明p是一个数组,数组内存的是int (*)()类型的函数
    作用:转移表,替换复杂的swich…case语句
  • 指向函数指针数组的指针:是一个指针,指向一个数组,数组元素是函数指针
    int (*(*pp)[])() //指向函数指针数组p的指针pp
    其中,*的优先级低于[ ]的优先级,[ ]的优先级低于( )的优先级

指针和数组的区别

  1. 指针在32位平台下只占4字节,而数组根据其长度占据一段连续的空间;
  2. 指针是可以修改的左值,数组是不可修改的左值;
  3. 数组名就是数组首元素的地址,而指针的名字是指针的地址,指针地址的内容是数组首元素的地址,所以使用指针访问的时候多一次间接寻址。
  4. 指针和数组定义一个字符串有区别,但是都是以'\0'结尾 的。
    char a[ ] = "abcdef"; // 存储位置由定义位置而定
    char *a = "abcdef"; //存储于常量区,不能被改变
  5. 数组名解释为第一个元素的指针,但是在sizeof求的大小却是整个数组的大小,而不是指针大小。

解释下面的代码

(*( void(*) ()) 0)();
void (*signal(int , void (*)(int)))(int);

  1. 首先,(void(*)( )) 0 意思是,将0强制转换为返回类型为void,无参数的函数指针,指针指向的地址为0。然后将这部分以fp替换,就是(*fp)(),这是一个函数调用,fp就是指向该函数的指针。
  2. 这个就有点复杂了,可以简化为
    typedef void(*pfun_t)(int);
    pfun_t signal(int, pfun_t);

猜你喜欢

转载自blog.csdn.net/qq_40840459/article/details/81225098