c语言指针(c语言指针函数)
怎么理解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语言中的指针是什么意思?
其实与其你在这里问,还不如看一看c语言教科书,上面写的都很详细
以下是谭浩强版的
在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。
既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。
内存单元的指针和内存单元的内容是两个不同的概念。
可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时,
银行工作人员将根据我们的帐号去找我们的存款单,
找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针,
存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。
既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其它数据结构的地址。在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?
因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。这样一来,凡是出现数组,函数的地方都可以用一个指针变量来表示,只要该指针变量中赋予数组或函数的首地址即可。这样做,将会使程序的概念十分清楚,程序本身也精练,高效。在C语言中,一种数据类型或数据结构往往都占有一组连续的内存单元。
用“地址”这个概念并不能很好地描述一种数据类型或数据结构,而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址,它是“指向”一个数据结构的,因而概念更为清楚,表示更为明确。
这也是引入“指针”概念的一个重要原因。
C语言中指针是什么
我们都知道:C语言中的数组是指 一类 类型,数组具体区分为 int 类型数组,double类型数组,char数组 等等。同样指针 这个概念也泛指 一类
数据类型,int指针类型,double指针类型,char指针类型等等。
通常,我们用int类型保存一些整型的数据,如 int num = 97 , 我们也会用char来存储字符: char ch = 'a'。
我们也必须知道:任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。
因此:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
c语言指针是什么 c语言指针介绍
1、c语言指针其实是一个整形变量,与其它数据不同的是,它的作用是用来存储其它变量的地址。指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。
2、因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
3、再打个比方:有个人让你去麦当劳帮我买个雪糕,那么麦当劳是这个变量a,但是那个人现在把麦当劳所在的地址写在纸上给你,那么这张纸就可以看做一个指向麦当劳的指针。
c语言指针详解
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。
为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。
C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。
当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。
CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。
如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。
变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。
需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。
扩展资料
指针使用(* 和 )
*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;。