指针的运算【C语言】

简介: 指针的运算【C语言】

1.数组名的理解


2.指针的运算和指针类型的意义


为了更好的理解上诉内容,下面将用具体代码解释和说明,以便后面自己复习和理解。可能有一点绕,但是结合具体代码看上几次就通透了。


下面就直接上代码了,相关说明和解释都在代码旁边的注释中给出。


PS:下一篇文章讲解了指针相关的经典面试题!


指针运算相关面试题详解【C语言】_crazy__xieyi的博客-CSDN博客

int main()
{
  int a[] = { 1,2,3,4 };
  printf("%d\n", sizeof(&a + 1));//4/8
  //&a取出的是数组的地址
  //&a-->  int(*)[4]
  //&a+1 是从数组a的地址向后跳过了一个(4个整型元素的)数组的大小
  //&a+1还是地址,是地址就是4/8字节
  printf("%d\n", sizeof(&a[0]));//4/8
  //&a[0]就是第一个元素的地址
  //计算的是地址的大小
    printf("%d\n", sizeof(&a[0] + 1));//4/8
  //&a[0]+1是第二个元素的地址
  //大小是4/8个字节
  //&a[0]+1 ---> &a[1]
  printf("%d\n", sizeof(a));//16
  //sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
    printf("%d\n", sizeof(a + 0));//4
  //a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地址
  //是地址,大小就是4/8个字节
    printf("%d\n", sizeof(*a));//4
  //*a中的a是数组首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素
  //首元素的大小就是4个字节
    printf("%d\n", sizeof(a + 1));
  //这里的a是数组首元素的地址
  //a+1是第二个元素的地址
  //sizeof(a+1)就是地址的大小
    printf("%d\n", sizeof(a[1]));//4
  //计算的是第二个元素的大小
    printf("%d\n", sizeof(&a));//4/8
  //&a取出的数组的地址,数组的地址,也就是个地址
    printf("%d\n", sizeof(*&a));//16
  //&a----> int(*)[4]
  //&a拿到的是数组名的地址,类型是 int(*)[4],是一种数组指针
  //数组指针解引用找到的是数组
  return 0;
}
int main()
{
  char arr[] = { 'a','b','c','d','e','f' };
    printf("%d\n", sizeof(arr));//6
  //sizeof(数组名)
    printf("%d\n", sizeof(arr + 0));//4/8
  //arr + 0 是数组首元素的地址
    printf("%d\n", sizeof(*arr));//1
  //*arr就是数组的首元素,大小是1字节
  //*arr --> arr[0]
  //*(arr+0) --> arr[0]
    printf("%d\n", sizeof(arr[1]));//1
    printf("%d\n", sizeof(&arr));//4/8
  //&arr是数组的地址,是地址就是4/8个字节
    printf("%d\n", sizeof(&arr + 1));//4/8
  //&arr + 1是数组后的地址
  printf("%d\n", sizeof(&arr[0] + 1));//4/8
  //&arr[0] + 1是第二个元素的地址
  return 0;
}
int main()
{
  char arr[] = { 'a','b','c','d','e','f' };
  printf("%d\n", strlen(arr));//随机值
  printf("%d\n", strlen(arr + 0));//随机值
  printf("%d\n", strlen(*arr));//--> strlen('a');-->strlen(97);//野指针
  printf("%d\n", strlen(arr[1]));//-->strlen('b')-->strlen(98);
  printf("%d\n", strlen(&arr));//随机值
  printf("%d\n", strlen(&arr + 1));//随机值-6
  printf("%d\n", strlen(&arr[0] + 1));//随机值-1
  return 0;
}
int main()
//{
  char arr[] = "abcdef";
  //strlen是求字符串长度的,关注的是字符串中的\0,计算的是\0之前出现的字符的个数
  //strlen是库函数,只针对字符串
  //sizeof只关注占用内存空间的大小,不在乎内存中放的是什么
  //sizeof是操作符
  //[a b c d e f \0]
  printf("%d\n", strlen(arr));//6
  printf("%d\n", strlen(arr + 0));//6
  //printf("%d\n", strlen(*arr));//err
  //printf("%d\n", strlen(arr[1]));//err
  printf("%d\n", strlen(&arr));//6
  printf("%d\n", strlen(&arr + 1));//随机值
  printf("%d\n", strlen(&arr[0] + 1));//5
  //[a b c d e f \0]
  /printf("%d\n", sizeof(arr));//7
  //printf("%d\n", sizeof(arr + 0));//4/8
  //printf("%d\n", sizeof(*arr));//1
  //printf("%d\n", sizeof(arr[1]));//1
  //printf("%d\n", sizeof(&arr));//4/8
  //printf("%d\n", sizeof(&arr + 1));//4/8
  //printf("%d\n", sizeof(&arr[0] + 1));//4/8
  return 0;
}
int main()
{
  int a[3][4] = { 0 };
    printf("%d\n", sizeof(a));
  printf("%d\n", sizeof(a[0][0]));
  printf("%d\n", sizeof(a[0]));
  //a[0]是第一行这个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组
  //sizeof(a[0])计算的就是第一行的大小
    printf("%d\n", sizeof(a[0] + 1));
  //a[0]并没有单独放在sizeof内部,也没取地址,a[0]就表示首元素的地址
  //就是第一行这个一维数组的第一个元素的地址,a[0] + 1就是第一行第二个元素的地址
    printf("%d\n", sizeof(*(a[0] + 1)));
  //a[0] + 1就是第一行第二个元素的地址
  //*(a[0] + 1))就是第一行第二个元素
    printf("%d\n", sizeof(a + 1));//4/8
  //a虽然是二维数组的地址,但是并没有单独放在sizeof内部,也没取地址
  //a表示首元素的地址,二维数组的首元素是它的第一行,a就是第一行的地址
  //a+1就是跳过第一行,表示第二行的地址
    printf("%d\n", sizeof(*(a + 1)));//16
  //*(a + 1)是对第二行地址的解引用,拿到的是第二行
  //*(a+1)-->a[1]
  //sizeof(*(a+1))-->sizeof(a[1])
    printf("%d\n", sizeof(&a[0] + 1));//4/8
  //&a[0] - 对第一行的数组名取地址,拿出的是第一行的地址
  //&a[0]+1 - 得到的是第二行的地址
  printf("%d\n", sizeof(*(&a[0] + 1)));//16
  printf("%d\n", sizeof(*a));//16
  //a表示首元素的地址,就是第一行的地址
  //*a就是对第一行地址的解引用,拿到的就是第一行
  printf("%d\n", sizeof(a[3]));//16
  printf("%d\n", sizeof(a[0]));//16
  return 0;
}
相关文章
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
156 13
|
7月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
3月前
|
人工智能
魔法指针 之 指针变量的意义 指针运算
魔法指针 之 指针变量的意义 指针运算
28 0
|
3月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
41 0
|
4月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
158 4
|
5月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
5月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
|
5月前
|
存储 编译器 C语言
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
|
6月前
|
编译器 C语言
【C语言初阶】指针篇—下
【C语言初阶】指针篇—下
|
6月前
|
存储 C语言
【C语言初阶】指针篇—上
【C语言初阶】指针篇—上