【c语言】数组和指针

来源:互联网 发布:大数据 图书 编辑:程序博客网 时间:2024/06/03 19:57

指针可以理解为一个变量,是一个专门用来存放地址的变量。

  • 一级指针
    一级指针可如下定义

  int *ptr = NULL;//整型指针,内容为空。  char* ptr = NULL;//char型指针,内容为空。  float* ptr = NULL;//浮点型指针,内容为空。

可如下使用:

     int  a= 10;     int *ptr = &a;
char指针解引用只能访问一个字节大小,而int指针解引用能访问四个字节大小,故指针的类型决定了指针能访问多大空间

32位机器上,一个指针变量的大小为4个字节
64位机器上,一个指针变量的大小为8个字节

  • 二级指针

      int  a= 10;      int *ptr = &a;      int **pptr = ptr;

ptr 是个一级指针,指向a的地址,pptr 是个二级指针,访问ptr ,通过解引用操作找到a的地址。

  • 一维数组

    一维数组可通过下标的形式访问,存储方式为连续存储,故而可以用指针访问,用指针拿到第一个元素的地址,可通过加减等操作访问数组里其他元素的地址,但不可越界,一旦越界,指针将指向无法预知的地方,也会发生不可预知的错误。
    在数组中因为我们的数组名即为数组首元素的地址,则可用指针进行如下访问:

int arr[5] = {1,2,3,4,5}int *ptr = arr;*(ptr+2)//表示ptr向后移动两个元素地址的大小并指向第三个元素的地址,然后进行解引用,拿到第三个元素。

这样,我们的ptr就指向了arr这个数组的首元素的地址。

  • 二维数组
    二维数组与一维数组的访问形式有所差别
int arr[2][2] = {{2,3},{4,5}};int *ptr = arr;int *pt = &arr[0][0];//拿到的是二维数组中第一个元素的地址

现在我们的ptr 指针指向的是arr这个二维数组,但是它指向的不再是首元素的地址,而是a[0](第一行)的地址。

  • 指针与数组的关系
    指针与数组可以互换,但不代表它们就是相等的,这里有一些它们的区别,(仅供参考,具体可看《c专家编程》的第四章与第九章)

    1. 指针是保存数据的地址,而数组仅是保存数据。
      2.指针通常用于动态数据结构,而数组通常用于存储固定数目且存储类型相同的元素。
      3.指针通常指向匿名数据,而数组自身即为数据名。
  • 指针数组

    指针数组即 数组元素为指针类型的数组,是一个数组。

int* arr[3];char* arr1[3];

如上,arr,arr1就是一个指针数组,但其arr 的三个元素类型是int * 类型的,arr1的三个元素类型为char * 类型。

  • 数组指针

    数组指针是一个指针,这个指针是指向数组的

int (*ptr)[5];char (*ptr1)[2];

如上,ptr , ptr1 是一个指针,指向一个数组,数组元素类型为int 型和char 型。

  • 函数指针

    函数指针使一个指针,这个指针指向一个函数。

int (*ptr)();

如上,ptr 是一个指针,这个指针指向一个函数,函数的返回类型是int 型的。

void (*signal(int sig, void(*func)(int)))(int);

signal 是一个函数,它返回一个函数指针,这个函数指针所指向的的函数有一个int 型参数,这个函数返回类型为void,而signal 这个函数的参数是这个函数指针指向的那个函数,即 void(*func)(int);

char * const*(*next)();

解析:next 是一个指针,指向一个函数,这个函数返回一个指针,这个指针指向一个只可读的指向char的指针。

以上两段代码是从《c专家编程》这本书上摘抄下来的,重点是分析这里的函数指针。《c专家编程》这一节内容还简化了第一个代码,有兴趣可以看看,在第三章。