指针知多少

简介: 指针知多少

作者简介:დ旧言~,目前大一,现在学习Java,c,Python等

座右铭:松树千年终是朽,槿花一日自为荣。

望小伙伴们点赞👍收藏✨加关注哟💕💕

⛵前言

不知道大家还记不记得初阶的指针☺️,那时我们讲的很浅🤔,只是知道有指针这玩意,看起来也迷迷糊糊😒,今天我们系统的来讲解指针,到底看看指针是否向传闻中的难到哭😮‍💨,话不多说正式进入今天的主题—C语言指针进阶 。

⛵主体

字符指针

💤字符指针是什么

字符指针 == char* p

💤字符指针使用

#include<stdio.h>
int main()
{
  char* ptr = "hello world.";
  printf("%s\n", ptr);
  return 0;
}

💦"hello world."字符串本质上是把首元素的地址给字符指针(首字符h的地址存放到指针变量ptr中

💤举个栗子

#include <stdio.h>
int main()
{
  char str1[] = "hello world.";
  char str2[] = "hello world.";
  const char* str3 = "hello world.";
  const char* str4 = "hello world.";
  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;
}

这里加const修饰的变量是不可以被修改的,而上面的代码结果是什么呢?让我们仔细来探讨探讨。🧐🧐🧐

不难看出,str1和str2分别开辟了不同空间,而被const修饰的"hello world."已在栈区开辟好了空间,因此str3和str4都指向同一个字符串。

②指针数组

💤指针数组是什么

指针数组 == int* p[10]

这里我们要明白,指针数组是指针还是数组?这里我们仔细来讲解,因为[]的优先级比 * 高,因此p是一个数组,有10个元素,每个元素的类型都是 int *,因此指针数组,本质还是数组。

这里我就不举例了,这里会和数组指针一起来举例子。

③数组指针

💤数组指针是什么

数组指针 == int(* p)[10]

这里我们要明白,指针数组是指针还是数组?这里我们仔细来讲解,因为()的优先级比 [] 高,因此p是一个指针,指向数组,数组有10个元素,因此数组指针,本质还是指针。

💤数组指针和指针数组比较

指针数组 == int* p[10] ➡️本质是数组

数组指针 == int(* p)[10] ➡️本质是指针

💤&数组名VS数组名

&数组名VS数组名都表示数组首元素的地址,但是有特例:

💫特例:

1️⃣sizeof(数组名):表示的是整个数组

2️⃣&数组名:取出的是整个数组

💤数组指针使用

大家不知道有没有看过博主的写的三子棋和扫雷,这里就用到数组指针,

#include <stdio.h>
void print_arr1(int arr[3][5], int row, int col)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      printf("%d ", arr[i][j]);
    }
    printf("\n");
  }
}
void print_arr2(int(*arr)[5], int row, int col)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      printf("%d ", arr[i][j]);
    }
    printf("\n");
  }
}
int main()
{
    //定义一个二维数组
  int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
  //调用函数
  print_arr1(arr, 3, 5);
  print_arr2(arr, 3, 5);
  return 0;
}

这里我们写上主函数,定义一个二维数组,开始调用函数,第一个函数使用最初我们常见的知识写的,后面的函数采用数组指针。

💤举个栗子

1️⃣int arr[5];

2️⃣int *arr1[10];

3️⃣int (*arr2)[10];

4️⃣int (*arr3[10])[5];

1.arr是个数组,数组里面有5个元素,每个元素类型为int。

2.arr是个数组,数组里面有10个元素,每个元素类型为int*。

3.arr是个指针,指针指向一个数组,数组有10个元素,每个元素类型为int。

4.arr是个数组,数组有10个元素,每个元素是个指针,指向一个数组,数组有5个元素,每个元素类型为int。

④指针参数

💤一级指针传参

#include <stdio.h>
void print(int *p, int sz)
{
 int i = 0;
 for(i=0; i<sz; i++)
 {
 printf("%d\n", *(p+i));
 }
}
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9};
 int *p = arr;
 int sz = sizeof(arr)/sizeof(arr[0]);
 //一级指针p,传给函数
 print(p, sz);
 return 0;
}

💤二级指针传参

#include <stdio.h>
void test(int** ptr)
{
  printf("num = %d\n", **ptr);
}
int main()
{
  int n = 10;
  int* p = &n;
  int** pp = &p;
  test(pp);
  test(&p);
  return 0;
}

⑤函数指针

💤函数指针是什么

函数指针 == int (*p)(int ,int )

这里我们要明白,函数指针是指针还是函数?这里我们仔细来讲解,p是一个指针,指向函数,返回类型为int,因此函数指针,本质还是指针。

⑥函数指针数组

💤函数指针数组是什么

函数指针数组 == int (*p[10])(int ,int )

这里我们可以解读为,有一个数组,数组的元素有10个,每个元素是指针,并且指向函数,返回类型是int

💤举个栗子

这里我们再实现简单的计算机。

💤方法一
#include <stdio.h>
int add(int a, int b)
{
  return a + b;
}
int sub(int a, int b)
{
  return a - b;
}
int mul(int a, int b)
{
  return a * b;
}
int div(int a, int b)
{
  return a / b;
}
int main()
{
  int x, y;
  int input = 1;
  int ret = 0;
  do
  {
    printf("*************************\n");
    printf(" 1:add 2:sub \n");
    printf(" 3:mul 4:div \n");
    printf("*************************\n");
    printf("请选择:");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      printf("输入操作数:");
      scanf("%d %d", &x, &y);
      ret = add(x, y);
      printf("ret = %d\n", ret);
      break;
    case 2:
      printf("输入操作数:");
      scanf("%d %d", &x, &y);
      ret = sub(x, y);
      printf("ret = %d\n", ret);
      break;
    case 3:
      printf("输入操作数:");
      scanf("%d %d", &x, &y);
      ret = mul(x, y);
      printf("ret = %d\n", ret);
      break;
    case 4:
      printf("输入操作数:");
      scanf("%d %d", &x, &y);
      ret = div(x, y);
      printf("ret = %d\n", ret);
      break;
    case 0:
      printf("退出程序\n");
      break;
    default:
      printf("选择错误\n");
      break;
    }
  } while (input);
  return 0;
}

向上面的代码,是我们学函数的时候使用的方法,那我们用函数指针数组咋办呢?

💤方法二
#include <stdio.h>
int add(int a, int b)
{
  return a + b;
}
int sub(int a, int b)
{
  return a - b;
}
int mul(int a, int b)
{
  return a * b;
}
int div(int a, int b)
{
  return a / b;
}
int main()
{
  int x, y;
  int input = 1;
  int ret = 0;
  //这里我们传入函数的地址,实现选择
  int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; 
  while (input)
  {
    printf("*************************\n");
    printf(" 1:add 2:sub \n");
    printf(" 3:mul 4:div \n");
    printf("*************************\n");
    printf("请选择:");
    scanf("%d", &input);
    if ((input <= 4 && input >= 1))
    {
      printf("输入操作数:");
      scanf("%d %d", &x, &y);
      ret = (*p[input])(x, y);
    }
    else
      printf("输入有误\n");
    printf("ret = %d\n", ret);
  }
  return 0;
}

⑦指向函数指针数组的指针

这里我就不在介绍了,大家自己上网查阅,看看这块知识点。

⛵指针拓展与练习

⛵结束语🎉🎉🎉

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

目录
相关文章
|
6天前
|
存储 C++
浅学指针(3)
浅学指针(3)
|
7月前
|
存储 C语言 索引
从零开始教你拿捏指针---指针初阶
从零开始教你拿捏指针---指针初阶
29 0
|
7月前
|
存储 C++
指针与数组的 “ 爱恨情仇 ”——指针进阶(一)
指针与数组的 “ 爱恨情仇 ”——指针进阶(一)
26 0
|
11月前
|
存储 C语言 C++
《C和指针》读书笔记(第六章 指针)
《C和指针》读书笔记(第六章 指针)
|
存储 C++
C++语法基础(七)——可恶的指针(一)
C++语法基础(七)——可恶的指针(一)
C++语法基础(七)——可恶的指针(一)
|
存储 C++ 索引
C++语法基础(七)——可恶的指针(二)
C++语法基础(七)——可恶的指针(二)
C++语法基础(七)——可恶的指针(二)
C++语法基础(七)——可恶的指针(三)
C++语法基础(七)——可恶的指针(三)
C++语法基础(七)——可恶的指针(三)
|
JavaScript 前端开发
迷失中的this指向,看完这篇就会了
this是一个比较迷惑人的东西,尽管你对this有很多的了解,但是面试题里面考察this指向,总会让你有种猜谜的感觉,知道一些,但是还是会出错,或许你猜对了,但是又好像解释不太清楚。
迷失中的this指向,看完这篇就会了
|
存储 C++
【C/C++教程】指针,指向何方?
一说到指针 可能大家的心里
98 0
【C/C++教程】指针,指向何方?
|
Java .NET C#
《指针的编程艺术(第二版)》一导读
指针的编程艺术(第二版) C语言的特色就是“指针”(Pointer),这是个让人又爱又难受的主题。有一句话是这么说的,学过C,而不会指针,那只能说你看过C。熟悉指针的人,会将指针比喻成天上那一颗最美的星星,而让不懂指针的人,头上冒星星,同样是星星,但却是完全不同的境遇。
1592 0