魔法指针 之 指针变量

简介: 魔法指针 之 指针变量

字符指针变量


字符指针

char ch = ' w ';

char* pc = &ch;  //取ch的地址

含有 char* 叫字符指针

字符数组

int main()
{
  char ch[] = "abcdefg";
  char* pc = &ch;
  
  printf("%c\n", *pc);
  printf("%c\n", pc[4]);
  printf("%c\n", "abcdefg"[4]);
  return 0;
}

代码解释

以上👆代码中:

1.ch 是个数组,里面存放着的值为 “abcdefg”

2.pc 是指向 ch字符数组的一个指针

此外,字符数组还有另一种表达方式

int main()
{
  const char* pc = "abcdefg";
 
  printf("%c\n", *pc);
  printf("%c\n", pc[4]);
  printf("%c\n", "abcdefg"[4]);
  return 0;
}

控制台结果显示

代码解释

1. pc 是指向常量字符串 " abcdefg " 的一个指针

2.而且常量字符串不能修改!!!

关于字符数组的试题

该试题是在《剑指offer》的一道笔试题,已经过稍微改动

int main()
{
    char str1[] = "hello bit.";
    char str2[] = "hello bit.";
 
    const char* str3 = "hello bit.";
    const char* str4 = "hello bit.";
 
    if (str1 == str2)
        printf("str1 and str2 are same\n");
    else
        printf("str1 and str2 are not same\n");
 
    if (str3 == str4)
        printf("str3 and str4 are same\n");
    else
        printf("str3 and str4 are not same\n");
 
    return 0;
}

看看这四个代码两两之间有什么区别?

代码解释


数组指针变量


数组指针

定义:int( * p)[n]; (注意优先级:()>[]> *)

栗子:(int (*p)[6]定义了一个指向含有6个元素的一维数组的指针。)

说明:

1.()优先级高,说明p是指针,指向一个整型的一维数组。

2.这个一维数组的长度是n,也可以说p的步长为n。

3.当p+1时,p指针会跨过n个整型数据的长度。

利用指针数组打印数组

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

打印二维数组

数组作为形参

row 行

cow 列

void Print(int a[2][3], int r, int c)
{
  int i = 0;
  for (i = 0; i < r; i++)
  {
    int j = 0;
    for (j = 0; j < c; j++)
    {
      printf("%d ", a[i][j]);
    }
    printf("\n");
  }
}
 
int main()
{
  int a[2][3] = { {1,2,3},{4,5,6} };
 
    //打印数组
  Print(a, 2, 3);
 
  return 0;
}

代码解释

在主函数 Print(a,2,3)中,

1.a表示数组首元素的地址

2.a[2][3]表示二行三列这个具体的值

当形参为指针时(指针数组)

void Print(int(*p)[3], int r, int c)
{
  int i = 0;
  for (i = 0; i < r; i++)
  {
    int j = 0;
    for (j = 0; j < c; j++)
    {
      printf("%d ", *(*(p + i) + j));
    }
    printf("\n");
  }
}
 
int main()
{
  int a[2][3] = { {1,2,3},{4,5,6} };
  Print(a, 2, 3);
 
  return 0;
}

代码解释

上面👆代码中:

void Print(int(*p)[3], int r, int c)

这个涉及到二维数组传参的本质:

传递的是地址,传的是一维数组第一行的地址

控制台结果显示:


函数指针变量


函数指针变量:是用来存放函数指针地址的

我们先理解下面表格

表示
数组名 数组首元素的地址
&数组名 整个数组的地址



表示
函数 函数的地址
&函数 函数的地址


利用函数实现加法输出的多种方式

int Add(int x, int y)
{
  return x + y;
}
 
int main()
{
  /*原始输出方式*/
  int ret = Add(3, 6);
  printf("ret  = %d\n", ret);
  
  /*利用函数指针变量输出*/
  /*输出方式一*/
  int(*p1)(int, int) = &Add;
  int ret1 = Add(2,9);
  printf("ret1 = %d\n", ret1);
 
  /*输出方式二*/
  int(*p2)(int, int) = Add;
  int ret2 = Add(2, 8);
  printf("ret2 = %d\n", ret2);
 
  /*输出方式三*/
  int(*p3)(int, int) = Add;
  int ret3 = (p3)(4, 7);
  printf("ret3 = %d\n", ret3);
 
  return 0;
}

控制台结果输出

关于函数指针我在这篇文章中详细讲过:函数指针

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