写点什么

【C 语言】进阶指针 seven

作者:謓泽
  • 2022 年 7 月 14 日
  • 本文字数:2643 字

    阅读完需:约 9 分钟

💥 指针和数组练习

①. sizeof(数组名) - 数组名表示整个数组,计算的是整个数组大小,单位是字节√

②. &数组名 - 数组名表示整个数组,取出的是整个数组的地址√

③. 除此之外所有的数组名都是代表数组首元素的地址√

💥注意:以上在 32 位平台上是 4 个字节,如果你是在 64 位的平台上那就是 8 个字节了。(在这里我们使用的是 32 位地址)



🔥 整形数组 - sizeof()

示例,如下代码所示 👇


    int a[] = { 1, 2, 3, 4 };  printf("%d\n",sizeof(a));   //计算整个数组的地址。  printf("%d\n",sizeof(a+0)); //这个不是单独放在sizeof()的内部,而是把(a+0)给一起放进去了。所以它表示的是首元素的地址。  printf("%d\n",sizeof(*a));  //*a是数组的第一个元素,所以计算的是第一个元素的大小。  printf("%d\n",sizeof(a+1)); //(a+1)是计算第二个元素的地址。  printf("%d\n",sizeof(a[1]));//计算数组下标第二个元素的地址。
printf("%d\n",sizeof(&a)); //&a,虽然是数组的地址,但是也是地址。所以,sizeof(&a)计算的是一个地址的大小。 printf("%d\n",sizeof(*&a)); //取出a的地址再进行解引用,指针是能够指向数组的地址。 printf("%d\n",sizeof(&a+1));//数组后面空间的地址,跳过一个数组地址。 printf("%d\n", sizeof(&a[0]));//取出第一个元素下标的地址 printf("%d\n", sizeof(&a[0] + 1));//取出第一个元素下标地址再加1那么就是第二个元素的地址。
复制代码


编译运行结果👇

16

4

4

4

4

4

16

4

4

4



🔥 字符数组 - sizeof()

示例,如下代码所示 👇


  char arr[] = { 'a','b','c','d','e','f'};  printf("%d\n", sizeof(arr));//计算整个数组的地址,注意数据类型。  printf("%d\n", sizeof(arr + 0));//表示首元素的地址,注意字符所占空间大小是1个字节。但是它是地址所以是4个字节  printf("%d\n", sizeof(*arr));//数组指针进行解引用,找到元素a的地址。  printf("%d\n", sizeof(arr[1]));//数组名第下标找到第二个字节。  printf("%d\n", sizeof(&arr));//取地址arr,arr是个地址。  printf("%d\n", sizeof(&arr + 1));//取出数组arr的地址加1跳过arr数组到‘f’的后面  printf("%d\n", sizeof(&arr[0] + 1));//取出arr下标第一个地址,再加1找到第二个元素的地址
复制代码


编译运行结果👇

6

4

1

1

4

4

4



🔥 求字符串长度 -  strlen()

示例,如下代码所示 👇  字符串长度头文件是 #include<string.h>


  char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };  printf("%d\n", strlen(arr));  printf("%d\n", strlen(arr + 0));  printf("%d\n", strlen(*arr));  printf("%d\n", strlen(arr[1]));  printf("%d\n", strlen(&arr));  printf("%d\n", strlen(&arr + 1));  printf("%d\n", strlen(&arr[0] + 1));
复制代码


编译运行结果👇

随机值

随机值

报错 - 不是合法地址

报错 - 不是合法地址

随机值

随机值

随机值

💥注意:上列数组是没有'\0',而'\0'是字符串长度的结束标志。



🔥 字符串数组 - sizeof()

示例,如下代码所示 👇


  char arr[] = "abcdef";  printf("%d\n", sizeof(arr));  printf("%d\n", sizeof(arr + 0));//首元素地址加0,还是首元素地址。  printf("%d\n", sizeof(*arr));//第一个元素'a'进行解引用。  printf("%d\n", sizeof(arr[1]));  printf("%d\n", sizeof(&arr));//arr取出的是整个数组的地址,但还是地址。  printf("%d\n", sizeof(&arr + 1));  printf("%d\n", sizeof(&arr[0] + 1));
复制代码


编译运行结果👇

7

4

1

1

4

4

4

💥注意:这里是字符串数组所以当中是有'\0'!



🔥 字符串数组 - strlen()

示例,如下代码所示 👇   从起始位置开始遇到'\0'停止


  char arr[] = "abcdef";  printf("%d\n", strlen(arr));  printf("%d\n", strlen(arr + 0));  printf("%d\n", strlen(*arr));  printf("%d\n", strlen(arr[1]));  printf("%d\n", strlen(&arr));  printf("%d\n", strlen(&arr + 1));  printf("%d\n", strlen(&arr[0] + 1));
复制代码


编译运行结果👇

6

6

报错 - 不是合法地址

报错 - 不是合法地址

6

随机值

5



🔥 字符串指针 - sizeof()

示例,如下代码所示 👇


  char *p = "abcdef";  printf("%d\n", sizeof(p));   //算出的是指针变量的大小。  printf("%d\n", sizeof(p+1)); //p+1是是b的地址,但它还是个地址。  printf("%d\n", sizeof(*p));  //指针解引用首元素的地址  printf("%d\n", sizeof(p[0]));//当成数组的形式取访问等价*(p+0)  printf("%d\n", sizeof(&p));  //取地址p取的也是p的地址  printf("%d\n", sizeof(&p + 1));//取出p的地址加1跳过p的地址   printf("%d\n", sizeof(&p[0] + 1));//第一个元素地址+1就是'b'的地址
复制代码


编译运行结果👇

4411444



🔥 字符串指针 - strlen()

示例,如下代码所示 👇


  char *p = "abcdef";  printf("%d\n", strlen(p));    //p里面存放的是a的地址,向后数字符遇到'\0'就停下。  printf("%d\n", strlen(p + 1));//p+1是b的地址,向后数字符遇到'\0'就停下。  printf("%d\n", strlen(*p));   //报错 - 不是合法地址  printf("%d\n", strlen(p[0])); //报错 - 不是合法地址  printf("%d\n", strlen(&p));   //随机值  printf("%d\n", strlen(&p + 1));//随机值   printf("%d\n", strlen(&p[0] + 1));//取出第一个元素地址+1就是'b'的地址。
复制代码


编译运行结果👇

6

5

报错 - 不是合法地址

报错 - 不是合法地址

随机值

随机值

5

🔥 二维数组 - sizeof()

示例,如下代码所示 👇


  int a[3][4] = { 0 };  //    (0)(1)(2)(3)   //(0)  0  0  0  0  //(1)  0  0  0  0  //(2)  0  0  0  0  printf("%d\n", sizeof(a));  printf("%d\n", sizeof(a[0][0]));  printf("%d\n", sizeof(a[0]));  //就可以理解成:第一行的数组名。  printf("%d\n", sizeof(a[0]+1));//a[0]就是第一行第一个元素的地址,a[0]+1就是第一行第二个元素的地址。  printf("%d\n", sizeof(*(a[0] + 1)));//a[0]+1就是第一行第二个元素的地址,然后对其进行解引用整形类型元素。  printf("%d\n", sizeof(a + 1));//a代表的是首元素的地址,然后+1。
printf("%d\n", sizeof(*(a + 1)));//第二行的地址进行解引用 printf("%d\n", sizeof(&a[0] + 1));//取出第一行的地址然后加1就代表第二行的地址。 printf("%d\n", sizeof(*(&a[0] + 1)));//第二行地址,解引用计算第二行的地址。 printf("%d\n", sizeof(*a));//表示第一行首元素的地址进行解引用得到第一行 printf("%d\n", sizeof(a[3]));//这里可以推测类型,a[3]起始是第四行的数组名(如果有)即使不存在也可以通过类型计算大小。
复制代码


编译运行结果👇

48416444164161616


发布于: 刚刚阅读数: 3
用户头像

謓泽

关注

一起happy! 2022.01.29 加入

谁也不知道旅途的终点是怎么样的,现在只不过是开始。便全力以赴!终点必将是星辰大海。 2021年度博客之星物联网与嵌入式开发TOP5 2021博客之星Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]

评论

发布
暂无评论
【C语言】进阶指针seven_7月月更_謓泽_InfoQ写作社区