嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2016-10-23 812 次浏览 标签 : C

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

指针数组

表示数组里存放的元素的类型是指针

#include <stdio.h>

int main(int argc, char const *argv[]) {
  int a = 1;
  int b = 2;

  int * p[2] = {&a,&b};

  printf("a addr:\t %p\n", &a);
  printf("*(p + 0) sddr:\t %p\n", *(p+0));

  printf("*(&a) value:\t %d\n", *(&a));
  printf("*(*(p+0)) value:\t %d\n", *(*(p+0)));
  return 0;
}

数组指针

上面关于int * p[2]的定义也可以写成int* p[2],或者int *p[2],但是不能写成int (*p)[2]

因为在语法分析的时候*符号是和左边的数据类型结合的,不管中间有多少空格,而使用()之后,则使得p称为一个指针,而在上面的例子中*p就表示为一个二维数组,每个子数组里面有2个元素,每个元素的数据类型为int

#include <stdio.h>

int main(int argc, char const *argv[]) {

  int arr[2][3] = {{1,3,5},{2,4,6}};
  int (*p)[3] = arr;

  printf("%d\n", *(*(p+0)+0));//1
  printf("%d\n", **p);//1
  printf("%d\n", *(*(p+1)+2));//6

  return 0;
}

对比指针数组和数组指针,第一段代码中p占的内存空间大小通过sizeof可以看到是占了8个字节,因为有两个指针。而第二个数组指针,则只占4个字节,因为它只是一个多维数组的指针,记录着这个多维数组的首地址。

挺绕的。

二级指针

#include <stdio.h>

int main(int argc, char const *argv[]) {

  int i = 10;
  int *p = &i;
  int **p2 = &p;

  printf("%d\n", **p2);

  return 0;
}

虽然名字叫法和上面的数组指针不一样,但是其寻址的过程,原来是一样的。

什么时候需要用到二级指针呢?之前写的笔记 https://mengkang.net/719.html

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表