关于C语言里面指针赋值的类型问题,还有一些关于指针的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言里面指针赋值的类型问题,还有一些关于指针的问题相关的知识,希望对你有一定的参考价值。

我马上准备参加全国计算机二级考试,我又几个问题想问下。
1.就是关于C语言里面的指针赋值类型是否必须要一致才能赋值,比如说int*p,float k,现在有个赋值p=k的错误是不是由于指针赋值的时候,类型必须要一致才行???
2,还有比如说有个char a[]='a','b','c','d','f','g',*p;
p=a;
print("%c\n",*p+4):
这个题目的结果是e,那么为什么不是f?,那么*p+4和*(p+4)有什么不同?
3,再看一个,char str[10];
scanf("%s",&str);
这个里面的&str和str是不是一个意思,是指这个字符数组的第一个字符的地址,还是整个字符?

1.
你这个赋值的错误应该是由于=左右的类型不一致造成的。=左边的p是指针类型,而右边是
数值类型。
指针赋值当然也是要一致才行。但是应该这么验证:
int *p; float q; p=&q; //注意q前面的取地址符
2.
*p+4是先取出*p,然后*p的值再加4。对于你说的,*p应该是数组的第一个元素,也就是'a'
,‘a’加上4就是'e'了。
*(p+4)是先计算p+4(此时指针指向了'f'),然后取其值。
3.不是一个意思。赋值的话直接用str就行了,如果加上&的话,就会有错误了。

祝你考试顺利~~
参考技术A 1。一个指针一个float完全不同的类型,当然不能赋值
2。你那个数组里哪有e呀?
3。当然不是一个意思,str是一个指针,&str是这个指针的地址,相当于二级指针了追问

第二个问题是*p+4,不是*(p+4)

追答

*p+4相当于(*p)+4在你的题中,就是‘a’+4
*(p+4) 在题中相当于a[4]

参考技术B 1.是。
2.结果没错,*p=a=65,再加4就是69,69就是e。而*(p+4)就是指a[4]。不是一个意思,第一个是指字符首地址,第二个是指第一个字符的地址,二者虽然是同一个值,但意义不同
参考技术C 1.p=k肯定是不对的,p是指针,k是个浮点数。例如float *p;int k;p=(float*)&k;也是可以的
2.*p+4表示把指针p指向空间的内容+4,即'a'+4,而*(p+4)则表示指针p指向的位置向后数4个的那个位置的值,即'f'
3.&str和str不是一个意思,str指向串首地址,&str是str的地址,可以理解成是地址的地址

学嵌入式C是基础之“C指针”

关于C指针的一些理解


有时总被指针的用法及类型所困扰,那我简单理解一下指针,希望对您有所帮助。


指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。如下例子:

(1)int*ptr; 

(2)char*ptr; 

(3)int**ptr; 

(4)int(*ptr)[3]; 

(5)int*(*ptr)[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] 


指针所指向的类型


当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如: 


(1)int*ptr;//指针所指向的类型是int 

(2)char*ptr;//指针所指向的的类型是char 

(3)int**ptr;//指针所指向的的类型是int* 

(4)int(*ptr)[3];//指针所指向的的类型是int()[3] 

(5)int*(*ptr)[4];//指针所指向的的类型是int*()[4] 


在指针的算术运算中,指针所指向的类型有很大的作用。 


指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型""指针所指向的类型"两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。


指针的值,或者叫指针所指向的内存区或地址


指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。 


指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。 


指针本身所占据的内存区


指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。 

此文由华清远见济南中心高级讲师—曲老师编写,希望能帮助到您。

如要详细了解,也可关注个人V :huaqinglaoli (技术交流)    


本文出自 “12294774” 博客,请务必保留此出处http://12304774.blog.51cto.com/12294774/1899388

以上是关于关于C语言里面指针赋值的类型问题,还有一些关于指针的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于C语言指针的问题

C语言---指针进阶

C语言 关于POINTER(指针)的问题, 急!!!!

关于c语言指针,希望老师详细解说下

C语言中关于结构体指针为啥不能在函数内赋初值的问题?

C语言运行问题关于赋值 char scanf的