c语言在对指针*P在进行赋值时,什么时候用变量名赋值,什么时候用变量的地址赋值?比如下面的例子

#include <stdio.h>
int main(){
//首先定义四个不同的数据类型,分别是:
//int型,数组型,字符型,字符串型
int Int=1;
int IntArr[]={2,3};
char Char='a';
char *String="hello";
//然后定义四对应的指针,分别是:
//int型指针,数组型指针,字符型指针,字符串型指针
int* P_int;
int* P_arr;
char* P_char;
char* P_string;
/*不同数据类型的指针,在进行赋值时,方法并不一样,
有时需要用&取地址后对指针进行赋值,有时直接用变量名对
指针进行赋值,请问有什么规律吗?*/
P_int=&(Int);
P_arr=IntArr;
P_char=&Char;
P_string=String;
return 0;
}

int * 类指针变量即可以指向一个int,也可以是int数组。
同理 char * 类指针变量即可以指向一个char也可以指向字符串
因为指针变量指向的数据不限定长度的,比如int *p ,那么这个p可以保存一个int变量的地址,也可以保存int一维数组的首地址,本质一样的,因为一个变量的地址类型与一维数组地址类型相同。
C/C++编译器不负责边界越界检查,这个工作由程序员负责,换句话说,编译器无法根据一个指针判断指向的内存是单个变量还是数组。
以上是指针赋值的要求,其实很简单,类型一致就可以赋值。

取地址部分
对于单个变量,需要取地址时,必须用&显式地告诉编译器,否则编译器隐式转换按取值处理,即默认取值。

对于数组,如果不给定索引只给数组名,则默认取地址,因为编译器无法确定你要取那个元素,
因此如果要赋值给指针,对于单个变量,那么只用变量名就是取值,包括指针变量(指针赋值给指针),要取地址需要加&。对于数组直接赋值即可。

重点:等号左右两边类型要一致,即左右值类型要相同。追问

说的我大概懂了,意思就是:基本数据类型,对于变量名的索引是变量的值,不能直接赋值给只接受地址类型的指针变量,需要取地址后赋值给指针。而对于数组和字符串而言,变量名的索引即是变量的地址,可以直接赋值给指针。

不过我顺着你的思路,想到,对于结构体这种可以存储不同类型数据的集合,其内存创建的方式应该和数组类似,那为何在对集合体类型的指针变量进行赋值时,也需要

取地址后

追答

"对于变量名的索引是变量的值",如果你将单个变量看作长度为1的数组也可以,此时单个变量取值默认索引为0,但一般我们不这么思考问题,和数学一样,尽可能化简,因此索引这个说法对于单个变量就没有意义。
另外索引不是地址,索引是0开始的自然数,标明数据相对位置,地址是内存存储起始位置,即首地址。
关于结构,当你用struct关键词定义一个结构时,就是定义了一个自定义变量,所以结构就是看作简单变量,只不过是个多变量复合体,由于已经给出定义,编译器就知道了包含的各变量的数据长度,编译器能明确就可以直接取值。而数组之所以编译器默认取地址,因为当你只给出数组名或者指针时,系统无法确定哪个元素,所以默认返回首地址。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-02-25
规律不规律都是编译器决定的,
普通变量 有名字,有地址,可以放数值。普通变量的地址是 &普通变量名, 普通变量名 本身代表变量所占用内存空间里存放的数值。
特殊变量如数组,名字就是地址。
指针变量是特殊一点的普通变量,其里面只能放地址值,其自身也有地址,指针变量名 本身代表其所占用内存空间里存放的数值,即地址。
只要是地址值就能赋给指针变量。所以只需看如何得到地址值就行。
&(Int) 、IntArr、&Char、String 都是地址。
理解了就能灵活运用了,如果有些概念不好理解,推荐用下中文C“习语言”。
第2个回答  2021-02-25

相似回答