魔法指针 之 指针变量的意义 指针运算

简介: 魔法指针 之 指针变量的意义 指针运算

程序展示


打印一个有10个元素的数组,将其全置为1

原始方式

int main()
{
  int arr[10] = { 0 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    //将数字全部置为1
    arr[i] = 1;
    //输出
    printf("%d ", arr[i]);
  }
 
  printf("\n");
  return 0;
}

指针变量方式

让我们先看一段代码

int main()
{
  int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
  //            0 1 2 3 4 5 6 7 8  9
  int sz = sizeof(a) / sizeof(a[0]);
  int* p = &a;//取a数组的地址
 
  printf("%d\n", a[1]);
  printf("%d\n", *(a + 1));
  printf("%d\n", *(p + 1));
  return 0;
}

结果会输出什么呢?

*(p+i) 或 * (a+i)是p+i 或a+i所指向的数组元素

([ ]是变址运算符,将a[i]按a+i计算地址,然后找出此地址单元的值)

小结:

可以看出,*(p+i),*(a+i),a[i]三者是等价的。

同理,我们也可以看出

*p 和 *arr 也是等价的,都是取首元素的地址

代码对比


指针运算


指针+-整数

用指针打印数组内容

int main()
{
  int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof(a) / sizeof(a[0]);
  int* p = &a;
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    /*方法①
    printf("%d ", *p);
    p++;*/
 
    /*方法②*/
    printf("%d ", *(p + i));
  }
  printf("\n");
  return 0;
}

结果打印输出

使用指针打印1-10中的奇数

int main()
{
  int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int* p = &a;
  int i = 0;
  for (i = 0; i < 5; i++)
  {
    printf("%d ", *p);
    p += 2;
  }
  printf("\n");
  return 0;
}

结果打印输出

倒序输出数组

int main()
{
  int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
  //            0 1 2 3 4 5 6 7 8  9
  int sz = sizeof(a) / sizeof(a[0]);
  int* p = &a[9];//指向数组最后一个元素
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", *(p - i));
  }
  printf("\n");
  return 0;
}

结果打印输出

指针-指针

指针 - 指针 = 地址 - 地址

需要指向同一块空间

看下段代码👇

int main()
{
  int a[5] = { 1,2,3,4,5 };
   //          0 1 2 3 4
  int* p1 = &a[4];
  int* p2 = &a[0];
  int* p3 = &a[1];
 
  printf("%d\n", p1 - p2);
  printf("%d\n", p1 - p3);
 
  return 0;
}

结果打印输出

小结:指针相减,代表的是指针之间的距离(用数组的元素来进行度量)

再看下段代码👇

int my_strlen(char* s)
{
  char* p = s;
  while (*p != '\0')
    p++;
  return p - s;
}
 
int main()
{
  printf("%d\n", my_strlen("abc"));
 
  return 0;
}

结果打印输出为:3

解释一下这段代码:

这段代码是链表算长度和找尾节点

把字符串传过去的地址拷贝了一份叫p

p-s是:p向后走了多少就知道字符串首尾差了多少

指针的关系运算

看下段代码

int main()
{
  int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof(a) / sizeof(a[0]);
  int* p = &a[0];
  while (p < a + sz)
  {
    printf("%d ", *p);
    p++;
  }
  printf("\n");
  return 0;
}

代码结果输出

代码解释

目录
相关文章
|
1天前
魔法指针 之 指针变量
魔法指针 之 指针变量
8 1
|
8天前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
24 2
|
10天前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
1月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
2月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
27 1
|
4月前
|
存储 C++
有关【指针运算】的经典笔试题
有关【指针运算】的经典笔试题
26 4
|
4月前
|
C语言
【C语言】:详解函数指针变量,函数指针数组及转移表
【C语言】:详解函数指针变量,函数指针数组及转移表
52 2
|
4月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
42 0
|
4月前
|
C语言
【C语言】:深入理解指针变量
【C语言】:深入理解指针变量
24 0
|
4天前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
10 0