❶ c语言 指针运算符,地址运算符是怎样工作的
我把“*”和“&”这两个运算符做了较详细解释。这段代码你可以拷贝到VC/VS工程中看,我不知道你学过计算机硬件知识没,如果你学过硬件的一些基础知识,就比较容易理解。不过没学过也可以理解。如果你不明白就再问
int main()
{
int arr1 = 12, arr2 = 15;
char ch1 = 'b', ch2 = 'h';
float f1 = 3.14, f2 = 3.15;
/* “*”地址运算符解释 */
/* 定义三个指针,这三个指针分别指向不同的数据类型 */
/* 注意:此处的“*”指针运算符是为了说明我们定义的变量是一个指针变量 */
int *p_arr = &arr1; //指针变量p_arr中存放的是arr1的地址
char *p_ch = &ch1 ; //指针变量p_ch中存放的是ch1的地址
float *p_f = &f1 ; //指针变量p_f中存放的是f1的地址
/* 注意:此处的“*”指针运算符是为了操作指针p_arr指向的元素 */
*(p_arr) = 30; //等价于把变量arr1赋值为30
*(p_ch) = 'c'; //等价于把变量ch1赋值为字符'c'
*(p_f) = 90.89; //等价于把变量f1赋值为浮点数90.89
/* “&”地址运算符解释 */
p_arr = &arr2; //把变量arr2的地址赋值给p_arr
p_ch = &ch2; //把变量ch2的地址赋值给p_ch
p_f = &f2; //把变量f2的地址赋值给p_f
return 0;
}
❷ c语言中指针就是地址,那&运算符也是地址,这话说的对吗
对!
严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址。
指针原理是这样的:其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放数据。
为了方便使用,编译器允许我们在写程序的时候,对抽屉进行命名(而不是使用抽屉的编号),这就是变量名。就比如说我们在程序中定义:char C; 这个时候系统会帮我们找一个空闲的抽屉(比方说编号为981的抽屉),命名为C,用于存放一个字符变量。以后我们在程序里只要使用C这个变量,系统就知道是要对981这个抽屉里的数据进行操作。
而指针是什么呢?指针是我们申请一个空抽屉,里面不放数据,而放编号。比如我们申请一个字符指针:char *ch=&C; 这个时候,ch里面放的是C这个变量的地址(也就是981),其中&是取址符,也就是取C这个变量的地址,而不是值。*ch才是ch指向的值。
❸ c语言中,指针和取地址运算符到底是什么啊,能不能通俗一点讲啊,谢谢
关于指针,统统都是在说内存的事情,内存就像一个大楼,每个格子都有一个门牌号,也就是地址。取地址符的作用就是得到内存中某一段内容的门牌号,以供后面的需要。指针就是通过一个门牌号找到这个内容,跟取地址是一对
❹ c语言中 “*”运算符的作用是 所谓“指针”就是
用作乘法,为百双目运算符,形式为a*b, 就是计算数学中的度a乘以b。用作取值运算,为单目运知算符,根据后续操作数(必须为指针)类型,取其指向的值。道
所谓的指针,本质上就是地址。 指针变量的值,就是地址的值,当取值运算时内就是到对应的内存地址上,依照指针类型进容行取值。
运算所需变量为一个的运算符叫单目运算符,例如【!,~,()】 。
运算所需变量为三个的运算符叫三目运算符:【?:】
(4)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语言中如何用指针运算符来表示一个二维数组的元素及地址
二维指针,就是说第一维是指针,第二维还是指针;
拿*(*(a+i)+j)来说:a是数组的首地址吧,然后+i,就是说a地址向后偏移i位。就是a+i的地址了,注意,这里a+i只是地址,用*符号取出该地址的数据,就是*(a+i),这里*(a+i)就是第一维指针,它指的是地址,不是数据。
而且后面的*(a+i)+j就是说以*(a+i)为首地址,偏移j位,然后使用*取内容,这里就是第二维了,取到的数据就是实际数据了
❼ C语言中地址操作符、指针操作符分别是什么
&是地址操作符。
e.g.
int a;
int *b;
b = &a; //&就是取a的地址,即是地址操作。
*是指针操作符,可以声明指针,也可操作指针所指的数据;
int *p;
*p = 10;
❽ c语言指针地址的全部表示方法
朋友那本书对指针还真的没解释多少.请看下面这个例子,看了你也应该会明白了float f = 1.1; // 定义一个<float>型的变量f,f的值为1.1;float* p = &f; // 定义一个<float * >类型的变量 p,值为&f(也就是变量f的在内存中的地址). 注意:指针也是一个变量,只是指针有点特殊,因为它只存储地址,(简单的说,指针就是一个用来存放地址的变量,)如果不懂,就继续追问.这一步你必须清楚了.*p = 3.3; // 将3.3的值付给p指向的变量.(*操作符又称作为间接值(indirect value) 或者解除引用(dereferencing)操作符.)float * p2 = p; // 定义一个指针p2让p2指向变量f.(请记住p就是一个存放地址的变量,就像普通变量一样,这条语句就是将p中存放的地址赋给p2);*p2 = *p; // 先取p指向的变量(解除引用),再取p2指向的变量(解除引用),最后将p指向的变量付给p2指向的变量,(其实这里没有任何意义,因为他们都指向变量f.这条语句相当于 f = f;)float** temp = &p; //如果对&p取地址,那么就应该用一个二级指针(**)来指向它,不然就没有任何意义. (个人认为)指针的主要用途还是体现在传递大的数据类型方面(还有一点就是他可以通过地址(指针),来改变变量的值).例如,一个很大的数组,或者一个很大的结构体,int value1[1000];typedef struct { int value2; float value3; char value4[100]; ........} test test astTest[50];千万不要以为这只是特殊的时候.其实这类复合型的数据是很常见的. 当某个函数需要调用他们时,如果直接传值调用的话...int function( int value1[1000], test astTest[50] );光是将原参数的值赋给函数的参数,就会浪费很多的内存,如果一个工程全是这样的函数,那么...很难想象.而且value1 和 astTestt的值还不会因为这个函数而改变..(不信可以试试,想要改变的话,还得将数组或作为返回值传递回来.). 但是如果用指针作为参数的话..int function2( int * value, test * astTest );这样就什么问题都OK了.慢慢体会一下...
❾ c语言中取地址符和*有什么区别
区别如下:
(1)两者根本意义不同。*是指针的意思,而&是去地址的意思,这两个相辅相成。
(2)用法不同。高级的c语言都是动态开辟内存,是使用malloc和free,这时就不用&了,因为取引用都是对于栈上的数据,在数据结构中,都是在堆上开辟数据容量。
(3)语言规则不同,变量类型加*就是一个指向该变量类型的指针,通俗点说,指针就是可以通过地址修改和获取该变量的值,而&符号只是获取该变量的地址!
指针中的“取地址符”
(9)c语言地址操作符指针扩展阅读:
引用的声明符放置在变量名的前面,和*操作符的用法一样。
引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。ra=1; 等价于 a=1;
声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。
故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
#include<iostream>using namespace std;int main()
{ int m[10]={1,2,3,4,5,6,7,8,9,10}; int (&n)[10]=m; for(int i=0;i<10;i++) cout<<m[i]<<' ' ;
cout<<endl; for( i=0;i<10;i++) cout<<n[i]<<' ' ; cout<<endl; return 0;}
例如:
int*pointer;//建立一个指针
int*&p1=pointer;/*
正确,编译系统把"int*"看成一体,把"&p1"看成一体,即建立指针pointer的引用,就是给指针pointer起别名p1。
int&*p2=pointer;//错误,这就变成了引用的指针。