当前位置:首页 » 编程语言 » c语言指针详解ppt
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言指针详解ppt

发布时间: 2023-02-15 15:10:42

‘壹’ c语言指针详解

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。

为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。

当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。

CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。

如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。

变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。

需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。

(1)c语言指针详解ppt扩展阅读

指针使用(* 和 &

*&a可以理解为*(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 *pa),绕来绕去,又回到了原点,*&a仍然等价于 a。

&*pa可以理解为&(*pa),*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa。

对星号*的总结

在我们目前所学到的语法中,星号*主要有三种用途:

1、表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。

2、表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。

3、表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p;。

‘贰’ C语言中指针的用法介绍(2)

如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘 sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。

总结一下,一个指针ptrold加上一个整数 n后,结果是一个新的指针ptrnew,

ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了 n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了 n乘 sizeof(ptrold所指向的类型)个字节。

一个指针ptrold减去一个整数 n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了 n乘 sizeof(ptrold所指向的类型)个字节,就是说, ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

第三章。运算?amp;和*

这里&是取地址运算符,*是...书上叫做"间接运算符"。

&a的运算结果是一个指针,指针的类型是 a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a 的地址。*p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。

例五:

int a=12;

int b;

int *p;

int **ptr;

Generated by Foxit PDF Creator ? Foxit Software

http://www.foxitsoftware.com For evaluation only.p=&a;//&a的结果是一个指针,类型是 int*,指向的类型是 int,指向的地址是a的地址。*p=24;//*p的结果,在这里它的类型是 int,它所占用的地址是p所指向的地址,显然,*p就是变量a。ptr=&p;//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是 int**。该指针所指向的类型是p的类型,这里是 int*。该指针所指向的地址就是指针p自己的地址。

*ptr=&b;//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b来给*ptr赋值就是毫无问题的了。**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指

针再做一次*运算,结果就是一个 int 类型的变量。

第四章。指针表达式。

一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。

下面是一些指针表达式的例子:

例六:

int a,b;

int array[10];

int *pa;

pa=&a;//&a是一个指针表达式。

int **ptr=&pa;//&pa也是一个指针表达式。

*ptr=&b;//*ptr和&b都是指针表达式。

pa=array;

pa++;//这也是指针表达式。

例七:

char *arr[20];

char **parr=arr;//如果把arr 看作指针的话,arr 也是指针表达式

char *str;

str=*parr;//*parr 是指针表达式

str=*(parr+1);//*(parr+1)是指针表达式

str=*(parr+2);//*(parr+2)是指针表达式

由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。

在例七中,&a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr 这个指针已经占据了内存,其实*ptr 就是指针 pa,既然 pa 已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。

第五章。数组和指针的关系

Generated by Foxit PDF Creator ? Foxit Software

http://www.foxitsoftware.com For evaluation only.如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文?lt;<如何理解c 和c++的复杂类型声明>>。数组的数组名其实可以看作一个指针。看下例:

例八:

int array[10]={0,1,2,3,4,5,6,7,8,9},value;

...

...

value=array[0];//也可写成:value=*array;

value=array[3];//也可写成:value=*(array+3);

value=array[4];//也可写成:value=*(array+4);

上例中,一般而言数组名array代表数组本身,类型是 int [10],但如果把array看做指针的话,它指向数组的第 0个单元,类型是 int *,所指向的类型是数组单元的类型即 int。因此*array等于 0 就一点也不奇怪了。同理,array+3 是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

例九:

例九:

char *str[3]={

"Hello,this is a sample!",

"Hi,good morning.",

"Hello world"

};

char s[80];

strcpy(s,str[0]);//也可写成strcpy(s,*str);

strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));

strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));

上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名 str 当作一个指针的话,它指向数组的第 0号单元,它的类型是char**,它指向的类型是char *。
*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即’H’的地址。

‘叁’ C语言指针运算详解

C语言中的数组是指 一类 类型,数组具体区分为 int 类型数组,double类型数组,char数组 等等。同样指针 这个概念也泛指 一类 数据类型,int指针类型,double指针类型,char指针类型等等。
通常,我们用int类型保存一些整型的数据,如 int num = 97 , 我们也会用char来存储字符: char ch = 'a'。
我们也必须知道:任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。
因此:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。

‘肆’ 怎么理解C语言里的指针

指针就是内存的地址。

内存懂吧,就是放数据的地方,数据就像一个人的家,懂吧,一栋楼里,肯定住了不止一家人吧,那么确定每家的地址,就需要几楼几零几这样设置地址吧。内存也是一样的,内存是按一个字节的大小来安排地址的。
比如int a;我们申请了一个int型,整形的变量,int是四个字节的数据类型,所以变量a在内存上会有一个地址,地址是按第一个数字为准的。假设内存上没有任何数据,都是空的,那么内存就会按顺序来放地址,假设内存的第一个地址是0,以此类推,那么当我们int a变量的时候,内存就会把0-3地址的空间分配给变量a,因为a占四个单元内存,那么怎么确定变量a的地址呢?计算机是按这个内存地址上的最开始那个算的,即变量a的地址是0。
当我们在声明了int a变量之后,再声明一个char b变量。如下:
int a;
char b;
这个时候,int a先被声明了,假设内存是空的,那么变量a就会被安排0-3的地址。第二个声明char b;就会接在变量a之后,因为char是一个字节的数据,所以内存只会分配一个4号内存给变量b,变量b的地址就是4。以此类推,其他类型是一样的。
指针就是用来存放内存地址的地方。指针变量一般也会单独存放。
比如:
int a; //内存分配编号为0-3的内存空间给变量a;变量a的地址就是最开头的那个编号即变量a的地址是0;
char b; //内存紧接着分配编号为4的内存空间给变量b,因为char是一个字节的,所以变量b的地址唯一,就是4。
随后,我们申请指针。
int * p;
char * t;
我们申请了两个指针, *是指针的标志,有*的变量是指针,没有*的是一般变量,*只是用来区别变量是int型数据还是指针。
当变量是指针的时候,意味着这个变量只能存放内存地址,而不能存放任何自然数。
即指针p,只能用p=&a; 变量a在C语言中,单用的时候,使用变量a里面存放的值,而不是他的地址,比如 我们再声明一个变量 int g; g=a;这个例子里,我们声明了一个int型变量g,并用g=a来初始化g,g=a的意思是,用a里存放的数,即读取出a里面存的数,然后把这个数给g,并不是把a的地址给g。所以C语言里规定了符号&为取地址操作符,p=&a;的意思就是取出a的地址,给p,这个时候是可以的,因为p是指针,并且p指针指向的类型是int。
在C语言中,给指针赋地址,要检查变量的类型的,比如int *p;这个指针p,p前面的*表示他是指针,说明他只能存放地址,*号前面的类型说明符,进一步说明,p这个指针只能存int型变量的地址,即如果p=&b;是不会成立的,并且会报错,因为p是一个存放int型变量的指针,而变量b是一个char型变量,在C语言里,指针和对应的变量的类型要一致。不能够混用。
不能混用的原因在于,到时候解引用的时候会出错,即如果 p=&b,成立的话,那么到时候使用 a=*p;的时候会出现严重错误,因为p=&b,是把char型变量的地址给int型指针,当我们在使用解引用符号*的时候,就会错误,a=*p;的意思是,用p里存放的地址,找到内存上的数据,并且给变量a,编译器会检查,得知p是int型变量指针,所以需要按照这个地址取出的数据是四个字节的数据,所以程序会把b的地址4按照int型的数据变量地址来使用,会调取内存上编号为4,5,6,7号位的数据,然而编号为4的内存上放的是char 型变量b的数据,5,6,7号内存上,根本没有数据,从而出错。所以C语言严格要求,指针的类型和变量类型要一致,即int *的指针只能存放int型变量的地址,不可混用。
最后一个疑问点在于*符号,在C语言里是复用的,即有三种使用方法,这里给你区别一样,要不然你会有疑问,* 这个符号,在C语言有三种意思,一种是乘法,即 a=5*3里,这个时候这个符号*是乘法的意思,认出他很简单,因为乘法必须要有乘数,被乘数,即符号*左右两边都要有实数或者变量,即使是c=a*b;的表达也不会错,a,b是变量的话,符号*是乘号用法。
第二种用法就是我们看到的 int *p;这里面符号*是指针的标志,只是用来说明p是一个指针,假设一个int p,那请问怎么区别p是指针还是变量,所以就是通过添加符号*来区别变量和指针的,而且指针和变量一样,都需要int,char,double等类型说明,所以只有在声明变量的时候,才使用。
第三中用法就是和符号&的操作相反的操作,符号&在C语言里,只有一个用法,就是表明,这个运算符是取出后面的地址,即&a,就是取出变量a的地址,即指针,符号&左边没有任何变量,只有右边有变量,而符号*则是相反操作,意思是取出符号*右边的指针里的地址,并取出这个地址里存放的数,所以*P,就是取出指针p里的地址,然后取出这个地址里存放的数。符号*也是右边有变量,而左边没有任何变量的操作,他们都是单操作符。
第二种和第三种用法要怎么区别,就是第三种一定是a=*p这样使用的,符号*的左边一定没有任何类型说明符,而如果是第二种用法,那么符号*的左边一定有类型说明符,即第二种一定是int *p; 即 类型说明符 + * +变量名的形式,而且只用在声明指针变量的时候。

‘伍’ 求解C语言指针,讲解越详细越好

p是一个包含四个指向char指针的数组
pp是一个指向char类型指针的指针 也就是一个二维指针 所以在输出的时候*pp就相当于p *(*pp+1)相当于*(p+1)也就是想当于p[1]
这个就是输出每个字符串的第二个字母 夜也就是O E I E

‘陆’ c语言指针的概念

指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。 学习指针是学习C语言中最重要的一环, 能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时, 指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。只要作到这些,指针也是不难掌握的。

指针的基本概念 在计算机中,所有的数据都是存放在存储器中的。 一般把存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等, 在第二章中已有详细的介绍。为了正确地访问这些内存单元, 必须为每个内存单元编上号。 根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。 既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。 内存单元的指针和内存单元的内容是两个不同的概念。 可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时, 银行工作人员将根据我们的帐号去找我们的存款单, 找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针, 存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针, 其中存放的数据才是该单元的内容。在C语言中, 允许用一个变量来存放指针,这种变量称为指针变量。因此, 一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。图中,设有字符变量C,其内容为“K”(ASCII码为十进制数 75),C占用了011A号单元(地址用十六进数表示)。设有指针变量P,内容为011A, 这种情况我们称为P指向变量C,或说P是指向变量C的指针。 严格地说,一个指针是一个地址, 是一个常量。而一个指针变量却可以被赋予不同的指针值,是变。 但在常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址, 是常量,“指针变量”是指取值为地址的变量。 定义指针的目的是为了通过指针去访问内存单元。

既然指针变量的值是一个地址, 那么这个地址不仅可以是变量的地址, 也可以是其它数据结构的地址。在一个指针变量中存放一
个数组或一个函数的首地址有何意义呢? 因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址, 也就找到了该数组或函数。这样一来, 凡是出现数组,函数的地方都可以用一个指针变量来表示, 只要该指针变量中赋予数组或函数的首地址即可。这样做, 将会使程序的概念十分清楚,程序本身也精练,高效。在C语言中, 一种数据类型或数据结构往往都占有一组连续的内存单元。 用“地址”这个概念并不能很好地描述一种数据类型或数据结构, 而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址, 它是“指向”一个数据结构的,因而概念更为清楚,表示更为明确。 这也是引入“指针”概念的一个重要原因。

‘柒’ 论述C语言中指针的概念和作用,并举例说明

1、指针概念:变量的地址(计算机内存字节的编号)叫做指针,存放变量地址的变量叫指针变
量,
简言之,指针是用来存放地址的。
2、作用:指向这个变量或数组的首地址,是变量的间接引用方式。其值如果改变,变量的值或数组元素的值也会跟着改变。程序对变量的操作实际上是对变量所在的存储空间读取和写入数据。方便对变量的操作。
举例说明:
int
a=3;/*定义一个整型变量a,并赋初值3*/
int
*p;/*定义一个指针变量P*/
p=&a;/*让p指向a的首地址,也就是a的地址*/
程序为a分配一个2个字节的存储单元,假如2个字节的地址分别为(ABCD1和ABCD2,唯一),那么p里面放的值就是ABCD1,不是3。这时可通过p直接引用a,实际上*p=3。以后不管a存放在内存中的哪个地方,只用通过调用p就可以引用a。这时如果令*p=4,则最后的a值也为4。对于数组,指针是指向数组的首地址。