C语言为什么可以赋给一个指针以常量求解
发布时间:2025-05-15 02:27:05 发布人:远客网络
一、C语言为什么可以赋给一个指针以常量求解
1、char s[10]; s="BOOK"是不对的,s是数组内存的首地址,首地址是不能改的,只能访问,不能将字符串常量的地址赋给S,就算能赋,你想啊,原来s是保存数组的地址,你赋值后,就变成了字符串常量的地址,那数组的内存不就不能访问了,这是不允许的,追问:
2、关于数组名的搞忘了,想起来了。难道”BOOK“也指的是个地址,而不是数组内容?给指针赋内容不应该用*是*S=
3、"BOOK"在这里是一个字符串常量,像你说的,是常量,它有一个地址,有一段内存区域,里面的内容就是"BOOK"这几个字符,不是数组内容,C语言里表示字符串就是用字符串常量和数组两种方式。
4、*除了作为乘法符号外,也是解引符号,比如int*p, p是一个指针,给它赋址p=&a,这里a是一个变量(int a=2),p保存了a的地址,解引就是访问p所指向的变量的内容,意思是int c=*p,和int c=a是一样的,*s是解引,访问它的内容,而且是访问当前指针指向的字符,s="BOOK"是赋值,把字符串的地址赋给s追问:
5、谢了。大概我能明白了。有个小疑问:常量不应该在内存中有地址的?就是”BOOK“应该无地址才对.除非把它当作个默认数组来处理,像perl里的@_?纯粹操蛋了,可以不回答、回答:你这样想char*s;定义了一个字符指针变量,用来保存字符变量的内存地址
6、s="BOOK",可以赋值,那说明"BOOK"是有地址的
7、你可以当做数组来处理,比如你可以这样操作:char cr=s[0]; s[1]='n';都是可以的,追问:
8、你说的我能明白。偶尔喜欢较真下。再等等,看有没有知道这个详细点的高手。到时再一起采纳你的。晚安米若de奇的感言:
二、在C语言中一个指针占用多少字节。
指针即为地址,指针几个字节跟语言无关,而是跟系统的寻址能力有关。
比如以前是16位系统,指针即为2个字节,现在一般是32位系统,所以是4个字节。
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
(2)char*ptr;//指针的类型是char*
(3)int**ptr;//指针的类型是int**
(4)int(*ptr)[3];//指针的类型是int(*)[3]
(5)int*(*ptr)[4];//指针的类型是int*(*)[4]
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
(1)int*ptr;//指针所指向的类型是int
(2)char*ptr;//指针所指向的的类型是char
(3)int**ptr;//指针所指向的的类型是int*
(4)int(*ptr)[3];//指针所指向的的类型是int()[3]
(5)int*(*ptr)[4];//指针所指向的的类型是int*()[4]
3、指针的值或者叫指针所指向的内存区或地址
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域。
我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
在32位平台里,指针本身占据了4个字节的长度。
三、C语言问题:指针变量,数组名,字符串常量的区别。
1、(A) s和p完全相同:s是字符串数组,p是字符指针,不同。
2、(B)数组s中的内容和指针变量p中的内容想等:s的内容"china",p的内容是s的首字节的内存地址,不同。
3、(C)s数组长度和p所指向的字符串长度相等:s数组长度是6(最后一位的值是0),p指向的字符串长度是5,不等。
4、(D)*p与s[0]值相等:正确。p=s,即p=&s[0],那么*p的值就等于s[0]。