① 【c语言,为什么类型不同的指针不能被赋值】
对于指针变量本身,所需的存储空间不管是什么类型的,都是一致的,区别在于它指向的变量的类型,不同的编译系统对类型所需空间的大小也是不一样的。例如有的int就是2个字节,而有的就是4个字节。
如果int是2个字节,float是4个字节,那么将其地址放在指针变量以后,类型决定了通过指针变量来操作指向的数据,是从起始地址开始的顺序几个字节中存取数据,如果是int型,那就是从地址开始的2个字节中存取数据,如果是float型,那就是从地址开始的4个字节中存取数据。这才是你提的问题的根本区别所在。
② C语言指针的赋值问题
指针在用要注意初始化,例如:
int *p;
p为指针,地址是未知的,如果直接赋值
*p=a;这样编译可以通过,但是会产生警告,p的地址是随机分配的,这样对未知的地址赋值很危险,可能会覆盖掉某些重要数据,所以避免这种危险,在定义指针时注意初始化,也就是赋值。
可以int *p=&a;
或者int *p;
p=&a;
然后再对p进行操作
有错。
注意大小写,还有
int a=9;
int *p;
p=&a;//这个是指针指向a
*p=8;
这样就对了。
(2)C语言不能对指针赋值扩展阅读:
指针的赋值
int *p;
int a;
int b[1];
p = &a;
p = b;
指针的赋值,“=”的左操作数能够是*p,也能够是p。
当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;
当“=”的左操作数是p时,改变的是p所指向的地址。
数组的变量名b表示该数组的首地址,因此p=b;也是正确的
同类型的指针赋值:
int val1 = 18,val2 = 19;
int *p1,*p2;
p1 = &val1;
p2 = &val2;
p1 = p2; //注意啦,p1指向了val2,而没有指向val1
备注:字符串与指针的初始化和赋值
初始化:
char *cp = "abcdefg"; //这个初始化过程,是将指针cp指向字符串的首地址,而并非传递字符串的值。由于,在C语言里面,没有总体处理一个字符串的机制
赋值:
cp = "abcdefg";
*cp=”abcdefg” ;//错误!字符串常量传递的是它的首地址,不能够通过*cp改动该字符串的值,由于该字符串为常量,而它仅仅是简单的将指针指向该字符串常量。
③ 在C语言中能否直接给指针指向的数据赋值为什么
可以直接给指针指向的数据赋值。
因为*p操作是这样一种运算,返回p的值作为地址的那个空间的取值。存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。
在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值。
(3)C语言不能对指针赋值扩展阅读:
两个地方要注意:
1、在程序声明变量的时候的*,只是表明“它是一个无符号整数,这个整数指向某个内存地址,一次访问sizeof(type)长度”。这点不要和(*)操作符混淆;
2、在C++程序声明变量的时候的&,只是表明“它是一个引用,这个引用声明时不开辟新空间,它在内存分配表加入新的一行,该行内存地址等于和调用时传入的对应参数内存地址”。
这点不要和(*)声明符,(&)操作符混淆。
网络-指针
④ 在C语言中能否直接给指针指向的数据赋值为什么
肯定能。
但你编写的:int
*p;*p=7;这样的程序不对。因为“能直接给指针指向的数据”赋值,而你编写的小程序里的p还没有指向,所以不能赋值;
这个指针叫“悬浮指针”,也叫野指针,它不能被赋值的。需要这样编写才可以:int
a,*p=&a;*p=7;
⑤ C语言中可以给指针变量赋值常数吗
C语言中可以给指针变量赋值常数,赋值方法为:
1、首先打开Microsoft Visual C++软件,单击“文件”菜单->“新建”,新建一个文件,文件名后缀为.c。
⑥ c语言中,为什么不能对字符指针变量指向的字符串再赋值
因为C语言中,凡是以""括住的形式直接出现,而且你又没有为其分配内存空间的字符串都是常量字符串,是不能修改其值的。
这样:
char a[6]="hello";
a[2]='c';
就可以了。
这里你为hello分配了一个长度为6的字符数组空间来存放。
(6)C语言不能对指针赋值扩展阅读:
给字符数组赋值的方法
1、定义的时候直接用字符串赋值
char a[10]="hello";
注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!
2、对数组中字符逐个赋值
char a[10]={'h','e','l','l','o'};
3、利用strcpy
char a[10];
strcpy(a, "hello");