指针是C语言的一个重要概念,正确而灵活的应用它,可以有效的表示复杂的数据结构,能动态分配内存,能方便的使用字符串,有效而方便的使用数组,在调用函数是能得到多于一个的值,能直接处理内存地址等。每一个学习和使用C语言的人,都应当深入的学习和掌握指针。
1、 地址和指针的概念(区分指针(地址)和指针变量)
内存中的每一个字节有一个编号,这就是“地址”。在程序中一般是通过变量名;来对内存单元进行存取操作的。因此在C语言中,将地址形象化的称之为“指针”。一个变量的地址成为该变量的指针,如果有一个变量专门来存放另一个变量的地址,则称她为“指针变量“。。指针变量的值(即指针变量中存放的值)是指针(地址)。
2、 变量的指针和指向变量的指针变量
变量的指针就是变量的地址,存放变量的地址的变量是指针变量,用来指向;另外一个变量。在程序中用“*”来表示指向。
2.1定义一个指针变量
C语言中所有的变量在使用前必须定义,指定其类型,并按此分配内存单元。
定义指针类型变量 例: 基类型 *指针变量名 ; int *point ;
使一个指针变量指向另一个变量: int *point=&a;
注意:1指针变量前面的*表示该变量的类型为指针型变量。变量名为point; 2在定义指针变量是必须指定基类型。牵扯到指针的运算。(整型与实型移动的字节数不同);指针变量可以指向的变量的类型。
2.2指针变量的引用
请牢记,指针变量只能存放地址(指针),不要将一个整型变量赋给一个指针变量。
例:(*point_1)++相当于a++. *point++:*与++为同一优先级,自右至左结合,
相当于*(point++)。
2.3 指针变量作为函数参数
注意(运用指针的)值传递(实参值发生改变)和“单向的”“值传递”(形参值的改变传不回实参,即形参改变实参不改变)
为了时在函数中改变了的变量值能被main函数所用,不能采取把要改变值得变量作为参数,而应该指针变量作为函数的参数,在函数执行过程中是指针变量所指的变量值发生改变,函数调用结束后,这些变量值得变化依然保留下来。这样就是想了:通过调用函数是变量的值发生变化,在主调函数中使用这些变化了的值。的目的。
Swap(int *p1,int *p2){int *p;p=p1;p1=p2;p2=p;}这样是不能够返回改变了的值的,即实参值未被改变。Swap(int*p1 int *p2){int*p;*p=*P1;*p1=*p2;*p2=*p}此函数可以返回别形参改变了的值,使北调函数可以使用改了的值。运用指针变量做参数,可以得到多个变化了的值。
3、 数组与指针
所谓数组元素的指针就是数组元素的地址。使用指针法能使目标程序质量提高(占内存少,运行速度快)。
3.1 指向数组元素的指针
C语言规定数组名代表数组中第一个元素的地址。
引用一个数组元素,可以用1 下标法,如a[i]形式。2 指针法,如*(a+i)或*(p+i);
数组名是数组首元素的地址,他是一个指针常量,它的值在程序运行期间是固定不变的。
要注意指针变量的当前值。
3.2用数组名做函数参数
数组名代表数组首元素的地址,唯一地址常量。
用变量名作函数参数时,属于值传递。不影响变量的地址未被改变,所以原实参变量不变。
用数组名做函数参数时,传递的是值的地址,形参变量和是参变量占用的是同一段内存单元,
地址改变了,所以原参数也发生了变化,可以实现通过调用一个函数来改变实参的值。
4字符串与指针
4.1字符串的表示形式
1 用字符数组存放字符串 2 用字符指针指向一个字符串char *string=”I LOVE CHAIN !”
Sting为字符型指针常量,它代表字符串的首字符的地址。
5 指向函数的指针
一个函数在编译时被分配给一个入口地址。这个入口地址就成为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。(每一个函数都占用一段内存单元,他们有一个起始地址)例:main(){int max(int,int);int (*p)(); int a,b,c; p=max; c=(*p)(a,b); }
1 指向函数的指针变量的定义形式
数据类型 (*变量名)(); 这里的数据类型为返回类型。
2(*P)()表示定义了一个指向函数的指针变量,他不是固定指向哪一个函数,指标是定义了这样一个类型的变量。
3 再给函数指针变量赋值时,只需给出函数名,不必带参数,因为它仅表示函数入口地址。
4 函数调用时,只需(*p)代替函数名即可[(*p)代替max].
5对函数的指针变量的运算是没意义的。
C语言学习笔记(指针)
关键词: 语言学习 笔记 指针 一个 数组 函数 地址 变量
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |