C语言指针个人理解

本文是关于C语言指针的个人理解笔记,涵盖了指针的基础概念、定义、赋值、引用,以及指针与一维、二维数组的关系,还包括指针数组、数组指针、指针函数和函数指针的使用。通过实例解析了如何利用指针进行数组操作,如数组逆置、数值之和、最大值查找、删除元素和冒泡排序等。
摘要由CSDN通过智能技术生成

一提到C语言,很多人第一时间想到的就是指针。究其根本就是指针以复杂著称,本人也是学习完第一遍之后也是和大多数人一样云里雾里,做题时也是一窍不通,后来有又多刷了几遍然后就豁然开朗,做题正确率也是十分的高。所以说学习指针真正诀窍在于学他个三五遍

本人的指针讲解严格意义上来讲根本不算是讲解,只是我个人的一个笔记罢了。

因为指针这个东西偏概念性,所以文字不好叙述,我在这里只会讲指针的大概,主要意图是为了供自己复习使用。

想看指针详细讲解的同学,可以去看这篇大哥的讲解 CSDN大神指针详细讲解,本篇文章适合有基础的同学进行观看。

一、什么是指针?

指针通俗来讲就是地址,指针就是地址,地址就是指针。我们定义了一个变量,系统对变量进行编译的时候就会给这个变量分配内存单元,内存若是一个公寓,那么内存单元就是公寓的一间间屋子,而指针就是公寓的“ 门牌号 ”。
在这里插入图片描述

二、定义指针变量

指针变量 : 含义就是存放变量地址的变量,本质仍然是变量
指针变量格式:

数据类型 *指针变量名  //eg   int  *a;   比普通的变量定义 多一个*,这里的*就是表示该变量为指针变量

注:若数据类型为void类型则表示该指针变量为空类型
指针变脸所占的字节数:

TC系统 VC系统
2字节 4字节

注:指针变量所占字节数和数据类型无关

三、指针变量的赋值

前面我们提到过指针变量保存的是变量的地址而非变量的元素数值,所以我们要把元素的地址给提取出来然后才可以进行下一步的赋值操作,这时候取地址运算符就应该现身了 &

取地址运算符 &
优先级 整数第二
结合性 从右往左
作用 获取变量的地址

用法很简单就是把变量的地址利用取地址运算符获取到然后再赋值给指针变量就可以达到赋值的操作。

举个栗子

int a=6,*p=&a;     //这时就把a的地址赋值给了指针变量p,指针变量p也就指向了元素a

注意!!!
1.&a赋值给的时指针变量p而不是* p, *只是起到定义作用
2.变量的数值类型要和指针的数值类型保持一致
3.若定义了一个指针变量等于NULL,则代表该指针为空指针,NULL的数值为0
4.上面例子的p = &a,输入数据时可等同使用

四、指针变量的引用

访问变量有直接访问间接访问两种

指针运算符/简介访问运算符/取内容运算符 *
优先级 正数第二
结合性 从右往左
作用 获取指针所指向对象的内容

这时候估计就会有很多同学就懵了,这个*一会代表定义指针变量,一会代表取内容运算符,到底算个神魔东西啊,不要慌请看下面表格便一目了然。
Please look at the table below

双目内为乘法 a*b
前有数据类型,后为定义的为指针 *p
定义之外且为单目运算符 取内容运算符

举个栗子

int a=5;
int *p=&a;
peintf("%d\n",*p);   //结果就为5,因为去内容运算符*就是取指针所指向的内容,指针指向a,a的内容为5,所以结果为5

二级指针:

格式:

int **q;

含义就是指向指针的指针,内部保存的就是指针的变量地址

int a=6;
int *q=&a;
int **p=&q;
printf("%d\n"**q);  //**q可以看成*(p)就是取q指针所指向内容,此时q指向q

五、指针和一维数组

重点!!!

一维数组的本质时内存中连续的存储单元,而一维数组的名字就代表一维数组的首地址,知道了首地址我们自然可以推算出其他数组元素的地址。

举个例子
int a[5];

第一种一维数组元素表示方法

a[0] a[1] a[2] a[3] a[4]
a(一维数组名) a+1 a+2 a+3 a+4

第二种一维数组元素表示方法
&[0] &[1] &[2] &[3] &[4]

5.1 位置差

指向同一个数组的两个指针可以做差,其含义是两个元素的元素差
设int *q,*p;

p==q p和q指向同一个位置
p<q p的位置指向在q指向位置的前面
p>q p的位置指向在q指向位置的后面

利用位置差实现数组的逆置

#include <stdio.h>
int main()
{
   
    int a[8]={
   1,2,3,4,5,6,7,8};
    int *p,*q;
    int t,i;
    p=a;
    q=a+7;
    for (;p<q;p++,q--)      //利用的就是位置差
    {
   
        t=*p; *p=*q; *q=t;    //交换的是内容
    }
    for (i=
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦同学学学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值