c语言中关于*和&的意思理解

我理解的是&是取地址,也就是说&a是取a的地址,那么p=&a也就说p里面存放的就是a的地址。
*p=&a那么就是*p是a的值,p还是a的地址
那么为什么不直接写p=a呢?
不知道我理解的对不对,如果有更合理更深度的理解,欢迎补充。
问题补充,如果没有&a这个前提,a=5,此时*p=a是什么意思

*代表指针运算符和乘法运算符;&代表取地址,与运算符,引用符。

用于二目运算中的按位(位运算)与运算:

单目是只需要一个操作数的意思,比如:a++ a--   *a  &a   

双目是需要两个操作数的意思,比如:a+b  a-b a*b  a/b  a%b  

三目是需要三个操作数的意思,比如:a=c>b?c:b;

例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。

扩展资料

运算符的使用

1、当需要初始化指针,以指向某些对象或函数时,需要获得这些对象或函数的地址:

floatx,*ptr;

ptr=&x;//合法:使得指针ptr指向x

ptr=&(x+1);//错误:(x+1)不是一个左值

2、当已具有一个指针,并且希望获取它所引用的对象时,使用间接运算符*(indirectionoperator),有时候这会被称为解引用运算符(dereferencingoperator)。它的操作数必须是指针类型。如果ptr是指针,那么*ptr就是ptr所指向的对象或函数。如果ptr是一个对象指针,那么*ptr就是一个左值,可以把它(即*ptr)当作赋值运算符左边的操作数:

floatx,*ptr=&x;

*ptr=1.7;//将1.7赋值给变量x

++(*ptr);//并将变量x的值加1

参考资料来源:百度百科—运算符

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-29
用做修饰符时,*表示指针,&表示别名
int *p; // p是一个指针
int &a = b; //a是b的别名(必须初始化)
而用作运算符时,*表示取值,&表示取地址
int a = 1;
int *p = &a; //取a的地址并初始化指针p
*p = 2; //修改p指向的值为2(a变成了2)
最后说一下你所谓的*p = &a;
这个语句表示取a的地址并赋值给p指向的内容。这条语句正确执行的前提是,p指向的内容是一个指针,也就是说p是二级指针。追问

这里面的前提是这样的,
typedef struct
{
char name[20];

float score;

}STD;
typedef struct
{
STD *data;
int listSize;
int length;

}sqlist
然后书上写道:
例如:
sqlist L,*p=&L;
请问这里是你说的二极指针么?

追答

sqlist L, *p=&L;
这条语句是变量定义,这里的*是修饰符,表示p是一个指针,指向L的地址。这并不是二级指针。二级指针如下:
int **p; //*是修饰符,表示p是二级指针
int a = 1;
*p = &a; //这里*是运算符,表示取p的值(这个值是一个指针)

本回答被提问者和网友采纳
第2个回答  2015-11-19
*p=&a那么就是*p是a的值,p还是a的地址

答:孩子,这个是错误的。int *p = &a; 是这样定义的。或者int *p; p = &a;
p是一个指向int类型的指针变量,里面装着神马随你喜欢,反正要是int的(因为他是按int的字节长度取数据的)。p = a;这个是神马来的?最基础的概念啦,P是指针类型的(指向int),a 是一个普普通通的int类型,能赋值吗?
指针这个没啥难度的,无非就是一个变量指来指去。是你初学不了解而已,不懂的追问吧追问

你的意思是说,使用指针必须先定义指针变量*p,然后下面我的p不用加*号已经是一个指针了?那么我该如何用指针表示出a的地址,还是说表示不了?
还有 如果没有&a这个前提。只是int a=5,此时*p=a是什么意思?

追答

你记住了,指针也是一个变量。没啥难度的。。什么是变量。在内存里开辟一个空间,内存是按字节(8bit)分的,一个int是八个字节,一个float是XX个字节。。PS:这个字节数是根据OS位数和编译器而定。如果是指针变量,那它就是存储地址的。例如:0x10b005b..这一种。int *p;就是一个变量,他在内存里面是八个字节(64bitOS)。但是这样定义不好,因为没有指向东西的指针叫野指针。这个不安全。至于里面放什么东西(内存)就看你了,例如int a = 90; int *p; p = &a;就是把a的地址给p了。*p就等于a(也就是90)。跟指针有关的还有->。。指针一般和结构体,数组,函数,结构体数组 结合使用:
(摘自百度知道):
float(**def)[10] double*(*gh)[10] double(*f[10])() int*((*b)[10])
我都说了*p =a是错误的,根本没这种写法好不好??int类型的怎么可能直接赋值给指针类型?用强转可以,不过意思从根本上发生变化。

第3个回答  2015-11-19
别想什么 *p=&a 了,把这种写法当成不存在就好了
相似回答