指针入门基础知识

本文详细介绍了C语言中的指针,包括指针变量的定义、指针的大小、不同类型指针的区分、指针与变量、数组、字符串的关系,以及指针运算和指针数组的概念。重点讨论了指针如何作为数组元素的地址,以及如何通过指针访问和修改数组元素。同时,文章提到了二级指针和字符串的存储方式,强调了不同存储区域的可修改性差异。
摘要由CSDN通过智能技术生成

指针笔记

  • 指针变量

    • 是个变量,是个指针变量,即这个变量用来存放一个地址编号

    • 在32位平台下,地址总线是32位的,所以地址是32位编号,所以指针变量是32位即4个字节

  • 注意:无论什么类型的地址,都是存储单元的编号,在32位平台下都是4个字节,即任何类型的指针变量都是4个字节的大小。

  • 对应类型的指针变量,只能存放对应类型的变量地址。

  • 扩展:字符变量 char ch ; ch占1个字节,他有一个地址编号这个地址编号就是ch的地址

  • 整型变量int a;占4个字节,它占有4个字节的存储单元,有4个地址编号。a的地址就是存储单元编号最小的编号即0X2000;

  • 指针的定义

  • 简单的指针

  • 语法格式:

  • 数据类型* 指针变量名

  • in* p //定义了一个指针变量p

    • 变量名是p

  • 关于指针运算:

    • &取地址(获取一个变量的地址)

    • *取值 (再定义一个指针变量的时候起到标识作用,表明这一个变量是一个指针变量,其他地方都是获取一个指针变量保存的地址里面的内容)

  • 如果在一行中定义多个指针变量,每一个指针变量前面都需要加*来修饰;

  • 指针大小

  • 在32位操作系统中所有指针都是4个字节(64位操作系统中为8个字节);

    • 不管地址内的空间多大,地址编号长度是一样大的,所以32位操作系统中所有指针大小都是4个字节。

  • 指针的分类

    • 字符指针char *p

    • 短整型指针 short int *p

    • 整型指针 int *p

    • tips:多字节变量,占多个存储单元,每个存储单元都有地址编号

      C语言规定,存储单元编号最小那个编号,是多字节变量的地址编号。

    • 长整型指针 long int *p

    • float型的指针 float *p

    • double 型的指针 double *p

  • 指针和变量的关系

    • 指针可以存放变量的地址编号。

    • 可以通过指针来引用变量

    • 指针变量在定义时候,也可以初始化。

    • int a;

    • int *p =&a ; //用a的地址,给p赋值,因为p是指针变量,指针就是用来存放变量的地址的。

    • 指针变量只能保存已经开辟好空间的变量的地址,不能随意保存地址。

  • 扩展:

  • 对应类型的指针,只能保存对应类型数据的地址,如果想让不同类型的指针相互赋值的时候,需要强制类型转换

  • 注意:

    • *指针 取值,取几个字节,由指针类型决定的,指针为字符指针,则取一个字节,指针为整形指针则取4个字节,指针为double则取8个字节。

    • 指针++ 指向下个对用类型的数据

    • 字符指针++ 指向宪哥字符数据,指针存放的地址编号加1

    • 整形指针++,指向下一个整形数据,指针存放的地址编号加4

    指针和数组元素之间的关系

    变量存放在内存中,有地址编号,咱们定义的数组,是多个相同类型的变量的集合,每个变量都占内存空间,都有地址编号

    指针变量当然也可以存放数组元素的地址。

  • 数组元素的引用方法

    • 方法一:(数组名+下标)

      • int a[10];

      • a[2]=100;

    • 方法二:(指针名+下标)

      • int a[10];

      • int *p;

      • p=a;//将a的地址保存在p里面。

      • p[2]=100;

  • 补充: C语言规定:数组的名字就是数组的首地址,及第0个元素地址,是个常量。

  • 注意:p和a的不同,p是指针变量,而a是个常量。所以可以用等号给p赋值,但不能给a赋值,tips:a相当于一个地址常量不能使用 a++。

    • 方法三:(通过指针运算加取值的方法来引用数组的元素)

      • int a[10];

      • int *p;

      • p=a;

      • *(p+2)=100;//也是可以的相 当于a[2]=100 ,p是第0个元素的地址,p+2是a[2]这个元素的地址。

        对第二个元素的地址取值,即a[2]

  • 指针的运算

    • 指针可以加一个整数,往下指几个它指向的变量,结果还是个地址。

      前提:指针指向数组的时候,加一个整数才有意义。

    • 两个相同类型的指针之间可以比较大小

    • 只有两个相同类型指针指向同一个数组元素的时候,比价大小才有意义,指向前面元素的指针小于指向后面元素的指针。

    • 两个相同类型的指针还可以做减法

      前提:必须是两个相同类型的指针指向同一个数组元素的时候,做减法才有意义,做减法的结果是,两个指针指向的中间有多少的元素。

  • 执行结果 3

  • 两个相同的指针可以相互赋值

  • 注意:只有相同类型的指针才可以相互赋值(void*类型的除外)

    int *p;

    int *q;

    int a;

    p=&a;

    q=p;

  • 注意:如果类型不相同指针想要赋值,必须进行强制类型转换。

  • 注意:C语言规定数组的名字,就是数组的后地址,就是数组第0个元素的地址。

  • 指针数组

  • 指针和数组的关系

    • 1.指针可以保存数组元素的地址

    • 2.可以订购一个数组,数组中有若干个相同类型指针变量,这个数组被称为指针数组。

  • 指针数组的概念:

  • 指针数组本身是个数组,是个指针数组,是若干个相同类型指针变量构成的集合。

  • 本质上就是一个数组。

  • 指针数组的定义方法:

    • 类型说明符 * 数组名[元素个数];

  • int * p[10]//定义了一个整型的之指针数组p,有10个元素p[0]~p[9],每个元素都是int * 类型的变量

    • int a ;

      p[1]=&a;

      int b[10];

      p[2]=&b[3];

      p[2]、*(p+2)是等价的,都是指针数组中的第二个元素,也就是b[3]的地址。

  • 指针的指针---------二级指针

    • 指针的指针,即指针的地址。

    • 注意:p q m 都是指针变量,都占4个字节,都存放地址编号。

  • 字符串的概念:

    • 字符串就是以‘\0'结尾的若干字符串的集合。

    • 字符串的存储形式:数组、字符串指针、堆。

    • 1、char string[100] ="I Love C!"

    • 定义了一个字符数组,string,用来存放多个字符,并且用"I Love C"给string数组初始化。

    • 字符串"I Love C"存放在string中

    char *str = "I love C!"

    定义了一个指针变量str,只能存放字符地址编号。

    所以说"I love C!"这个字符串中的字符,不能存放在str指针变量中。

    str只是存放了字符I的地址编号,"I love C"存放在文字常量区

    char *str =(char )malloc(10ziseof(char));//动态申请了10个字节的存储空间,首地址给str赋值。

    strcpy(str,"I love C")//将字符拷贝到str指向的内存中。

  • 字符数组:

    • 在内存(栈,静态全局区)中开辟了一段空间存放字符串。

  • 字符串指针:

    • 在文字常量区开辟了一段空间存放字符串,将字符串的首地址付给str

  • 堆:

    • 使用malloc函数在堆区中申请空间,将字符串拷贝到堆区。

  • 注意:

    • 可修改性:

      1. 栈和全局内存中的内容是可以修改的。

        1. char str[100]= "I love C!";

        2. str =‘y';//正确可以修改的

      2. 文字常量区的内容是不可以修改的

        1. char *str="i love C!";

        2. str ='y';//错误,i存放在文字常量区中,不可以修改。

  • 数组指针

  • 二二维数组,有行、有列。二维数组可以看成有多个一维数组构成的,是多个一维数组的集合,可以认为二维数组的每一个元素就是个一维数组。

  • 例如:

    • int a[3] [5];

    • 定义了一个三行五列的一个二维数组。

    • 可以认为二维数组a由3个一维数组构成,每个元素是一个一维数组。

    • 回顾:

      • 数组的名字可以是数组的首地址,是第0个元素的地址,是个常量,数组名字加1指向下一个元素。(每个一维十足五个元素)

    • 二维数组的数组名可以理解为行指针,即+1后指向下一行的首地址。

    • 数值指针的概念:本事是一个指针,指向一个数值,加1跳一个数组,即指向下个数组。

    • 数组指针的定义方法:

    指向的数组类型 (*指针变量名)[指向数组到元素个数]

    int (*p)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

君民

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

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

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

打赏作者

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

抵扣说明:

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

余额充值