C语言/c++指针详细讲解【超详细】【由浅入深】

指针用法简单介绍

指针,是内存单元的编号。

内存条分好多好多小单元,一个小单元有 8 位,可以存放 8 个 0 或 1;也就是说,内存的编号不是以位算的,而是以字节算的,不是一个 0 或 1 是一个编号,而是 8 个 0 或 1 合在一起是一个编号。这个编号,就是地址。

内存条就分为好多小格子,一个格子一个编号(地址),相当于房子,一个房子一个地址。

[所谓的指针,就是地址。]

*p表示的是以p的内容为地址的变量

#include <stdio.h>

int main() {

int* p;//p是变量的名字,int*表示变量p存放的是int类型变量的地址

//int* 是p的数据类型,p是变量的名字。所谓的int*类型,就是可以存放int类型变量的地址的变量的类型

int i = 3;

/*

  i是整型int类型的变量,可以把变量i的地址放到变量p里

  &i表示i的地址,&是取址符,表示获取一个变量的地址

 */

p = &i;//把int类型的变量放到int*类型中

/*

  类似的,double* p只能存放double类型的变量的地址,

  而不能存放int类型的变量的地址

 */

 /*

   关于对p=&i的理解:

   p存放了i的地址,所以根据p可以知道i的位置,进而找到i。

   所以说,p指向i。

   p不是i,i也不是p;修改i的值不会改变p的值,修改p的值也不会影响i的值

   举个例子:[小明](指针变量p)手里拿了一张写了[小红家庭地址](变量)的[纸条](指针变量p存储的i地址&i),

   小红的家庭发生任意改变,比如小红家新买了一辆汽车、丢了一袋垃圾,小明手中的纸条都不会发生改变

   (变量i的值发生任意改变,+1或者-1,都不会影响指针变量p里存放的值)

   小明在手里原本写着小红家庭地址的纸条上进行任意修改,小红的家的位置也不会发生任何变化

   (原本存放变量i的地址的指针变量p的值发生任意变化也不会影响变量i的值)

  */

  /*

int* p;int i;

p和i都是变量,p是能存放其他类型的变量的地址的指针变量,i是只能存放其相应类型的值的普通的整型变量。

指针和地址是一个概念,指针变量也可以叫做地址变量

指针变量p存放了变量i的地址---指针变量p指向了变量i

   */

printf("%d", *p == i);//1-->说明*p和i的值是一样的

/*

  如果一个指针指向了某个变量,则:

  *指针变量<---等价于--->普通变量

  如:

  如果p是指针变量,p存放了普通变量i的地址,则p指向i

  *p<---等价于--->i

  *p和i可以彼此之间相互替换使用

 */

 /*

  *p表示的是以p的内容为地址的变量

  */

return 0;

}

指针和指针变量的区别:

指针就是地址,地址就是指针。

地址[指针]就是内存单元的编号。

指针变量是存放地址[指针]的变量

指针[地址]和指针变量是两个不同的概念

但是,有时候在叙述的时候,会把指针变量简称为指针,但是二者不是一回事儿

指针的重要性

·指针可以表示一些复杂的数据结构(比如用链表表示的一些数据结构)

·快速的传递数据

·使函数返回一个以上的值

·能直接访问硬件

·能够方便的处理字符串

·是面向对象语言中引用的基础

指针是C语言的灵魂

指针的定义

指针就是地址,地址就是指针。那么,指针和地址到底是什么?

地址

·内存单元的编号(就像房门牌号一样)

·地址是从0开始的非负整数

·[地址的范围,取决于系统的位数。在32位系统中,一个地址的范围是从0到2^32-1,即从0到4294967295。而在64位系统中,一个地址的范围是从0到2^64-1,即从0到18446744073709551615。这些范围都是基于系统的内存大小和寻址能力来确定的。]

指针

·指针就是地址,地址就是指针

·指针变量就是存放内存单元编号的变量,或者说,指针变量就是存放地址/指针的变量

·指针[地址]和指针变量是两个不同的概念。但是,有时候在叙述的时候,会把指针变量简称为指针,但是二者不是一回事儿

·指针的本质就是一个操作受限的非负整数

[“非负整数”,指地址是“从0开始的非负整数”。

“操作受限”,指针之间的运算只可以进行减法,不能进行加乘除运算]

指针可以进行那些运算

为什么指针只可以进行减法,不能进行加乘除运算?

两个指针相减的结果是一个整数值,表示两个指针之间相隔的元素个数或者内存单元的数目。

在数组中,如果两个指针指向同一个数组的元素,那么它们相减的结果就是它们之间相隔的元素个数。这个结果是一个整数,表示两个指针之间有多少个元素。例如,如果一个指针指向数组的第i个元素,另一个指针指向数组的第j个元素,那么它们的差值就是j-i,表示它们之间相隔的元素个数。

同样地,在内存中,如果两个指针指向不同的内存单元,那么它们相减的结果就是它们之间相隔的内存单元数目。这个结果是一个整数,表示两个指针之间有多少个内存单元。例如,如果一个指针指向内存地址A,另一个指针指向内存地址B,那么它们的差值就是B-A,表示它们之间相隔的内存单元数目。

需要注意的是,两个指针相减的结果是一个整数值,而不是地址量。这个整数值表示两个指针之间相隔的数据个数,而不是它们的内存地址差值。因此,在计算两个指针相减的结果时,应该将它们的地址值进行整数相减,而不是将它们的内存地址直接相减。

总之,两个指针相减的结果是一个整数值,表示两个指针之间相隔的元素个数或者内存单元的数目。这个结果是根据指针所指向的数据类型和内存布局来确定的。通过计算指针之间的差值,程序员可以方便地进行数组遍历、内存管理和其他相关操作。

然而,两个指针[地址]相加,就像一个门牌号加上另一个门牌号一样,没有实际意义。一个门牌号在减去另一个门牌号得到的整数就可以表示两个房间之间相差了多少个房间。(比如,房间1006和房间1001之间差了5个房间;1006-1001=5)。同样的两个指针[地址](门牌号)相乘或相除也没有实际意义。

但是指针还可以与整数进行相加减。

指针与整数的加减表示指针在内存空间中向下或向上移动整数个单位。这个单位的大小取决于指针所指变量的类型。例如,如果是指向short型变量的指针,那么每次移动2个字节;如果是指向double型变量的指针,那么每次移动8个字节。当指针变量增加1时,其增加的值等于指向的类型占用的内存字节数。

指针与整数的加减运算在数组中位置的移动和内存地址的偏移中有实际应用。例如,通过将指针变量增加1,可以使其指向下一个数组元素,从而实现数组的遍历。同样地,通过指针与整数的加减运算,可以方便地访问和操作内存中的不同位置,实现动态内存分配、函数参数传递和数据结构实现等功能。

需要注意的是,指针与整数的加减运算是有单位的,以它所指向数据类型的字节数为单位进行加减。在C语言中,指针加法是以所指向数据类型的大小为单位的,例如int类型的指针加1就意味着偏移4个字节(假设int类型占用4个字节)。

总之,指针与整数的加减运算表示指针在内存空间中的移动。这种运算在数组索引、指针移动和内存访问等操作中具有重要意义,使程序员能够灵活地操作内存和数据结构,实现高效的数据处理和内存管理。

就行门牌号1003,加上一个整数2,就变成了门牌号1005的房间的地址;减去一个整数3,就变成了门牌号1000的房间的地址。

同样的,指针和整数之间不能进行乘除运算,没有实际意义。

【如果两个指针变量指向的是同一块连续空间中的不同存储单元,这两个指针变量才可以相减】

基本类型指针

[知识点前面已经说了,这里看几个代码示例:]

示例一

注意下面的代码的错误:

#include <stdio.h>

int main(){
    int* p;
    int i=5;
    *p=i;
    printf("%d",*p);
    return 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chinacha_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值