写点什么

【C 语言】指针 Four 之 [" * & 的应用"、通过指针交换变量值、指针变量的说明、 指针类型的意义 (1)、指针类型的意义 (2)]

作者:泽En
  • 2022 年 5 月 19 日
  • 本文字数:1776 字

    阅读完需:约 6 分钟

【C 语言】指针 Four 之[" * & 的应用"、通过指针交换变量值、指针变量的说明、 指针类型的意义(1)、指针类型的意义(2)]

🗡 " * & 的应用"

如下所示👇


#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(void){  int i = 0;  int* p = &i;  printf("请输入数字:");  scanf("%d", &i);  printf("numbers1 = %d\n", *&i);  printf("numbers1 = %d\n", i);  printf("numbers1 = %d\n", *p);
return 0;}
复制代码


运行结果

三个 printf() 打印的值都是一样的(同样可以思考下这个是为什么)



🗡 通过指针交换变量值

既然都看到这里了,那么我们就来尝试做一道题目吧,看看你是否掌握这些知识点了。

题目内容:用指针交换两个值。


#include <stdio.h>void swap(int *pa, int *pb){  int temp = *pa; //10    *pa = *pb;      //20  *pb = temp;     //10}int main(void){  int a = 10, b = 20;  int *pa = &a, *pb = &b;  printf("交换前的值:a=%d, b=%d\n", a, b);
swap(pa,pb); printf("交换后的值:a=%d, b=%d\n", a, b); return 0;}
复制代码


运行结果🖊

交换前的值:a = 10, b = 20

交换后的值:a = 20, b = 10

对程序进行说明如下↓

swap() 是用户定义的函数,它的作用是交换两个变量 (a 和 b) 的值。swap 函数的形参 papb 是指针变量。程序运行时,先执行 main 函数,已知 a 和 b 的值。然后将 a 和 b 的地址分别赋给指针变量 papb,使 pa 指向 a,pb 指向 b

用图形表示如下如下↓



🗡 指针变量的说明

指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算符以及关系运算。

指针运算符如下↓

  1. 取地址运算符 &: 取地址运算符 &单目运算符,其结合性为自右至左,其功能是取变量 的地址。

  2. 取内容运算符 : 取内容运算符 ***** 是单目运算符*,其结合性为自右至左,用来表示指针变 量所指的变量。在*运算符之后跟的变量必须是指针变量。

需要注意的是指针运算符* 和指针变量说明中的指针说明符* 不是一回事。在指针变量说明中, “*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*” 则是一个运算符用以表示指针变量所指的变量。



 🗡 指针类型的意义(1)

指针类型的意义,代码如下所示↓

int a = 0x11223344;int *pa = &a;*pa = 0;
复制代码


此时,经过调试阶段我们可以发现,首先 a 的地址赋值给指针变量并且对象类型是 int 类型。然后,再通过 解引用 *pa 把原来 &a 的地址变成 0,那么通过这个现象,我们就可以知道用 int * 进行解引用的话,我们是成功访问到 ④个字节 的地址。是不是可以说明指针访问字节是个字节呢。




int a = 0x11223344;char *pa = &a;*pa = 0;
复制代码


经过调试阶段我们可以发现,首先 a 的地址赋值给 指针变量并且对象类型是 char 类型。然后,再通过 解引用 *pa 把原来 &a 的地址变成 0。那么通过这个现象,我们就可以知道用 char * 进行解引用的话,而我们是成功访问到 ①个字节 的地址。可以看出只是类型发生了变化,访问权限就会发生变化从这里说明了指针是只能访问个字节的,这是 C 语言语法标准规定死的





所以从上面两个不同指针对象,我们就可以从中发现。只是不同类型的变化,就可以在调试当中发现它们的访问权限就发生了变化这就从中说明指针类型是具有意义的

如果我是个整形指针(int*)的话,解引用的时候,我去访问一次的话。解引用一次就可以访问个字节。按照上面图中我就可以把个字节全部变成 0 了。

然而,如果我是一个字符指针(char*)的话。我解引用一次我就只能访问其中的个字节。

通过这个例子可以知道:不同类型指针在解引用的时候就决定它的访问权限有多大


🗡 指针类型的意义(2) 

接下来,举出第②个例子。如下代码所示↓

#include<stdio.h>int main(void){    int arr[10] = {0};    int *p = arr;    char *pc = arr;    printf("%p\n",p);    printf("%p\n",p+1);
printf("%p\n",pc); printf("%p\n",pc+1); return 0;}
复制代码


编译器运行结果如下↓



在第二行编译运行结果上,如果是我整形指针+1 的话。我实际上的值+4

在第四行编译运行结果上,如果是我字符指针+1 的话。我实际上的值+1

字符指针+1 的话,相当于跳过了一个字符。那么跳过一个字符的话,我不就相当于+1

如果我是整形指针+1,相当于跳过一个整形。如果跳过一个整形,就相当于跳过 4 个字节。那其实就是相当于+4

那这个为什么会产生这样的不同呢?因为 p 以及 pc 的指针类型不同

那么从这个角度可以知道:指针类型决定了指针走一步就可以走多远,也就是步长。

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

泽En

关注

一起happy! 2022.01.29 加入

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

评论

发布
暂无评论
【C 语言】指针 Four 之[" * & 的应用"、通过指针交换变量值、指针变量的说明、 指针类型的意义(1)、指针类型的意义(2)]_5月月更_泽En_InfoQ写作社区