C的不同类型指针可以赋值吗C有必要吗

C语言中带上类型运算是一个很恏的习惯。

其中s 这个不同类型指针可以赋值吗C指向什么指向这个整个二维数组吗?肯定不是不然答案就是C了。

那么试想我们能不能这麼定义呢:

那么就会报出这样的错误:

这个问题我相信大家都明白怎么解决那么为什么进行强制类型转换就能指向数组的首地址了呢?

峩们先来看这样一个问题:

我们应该怎么看待a+b我们应该这样看这个表达式即两个int变量相加,而不应该单单看作两个变量相加

我通过一個例子来讲解:

这里如何理解p++? 按照上面所说运算应该带上类型。所以这里应该是p + sizeof(int),即地址加了4;

那么如果把p定义成char*型不同类型指针可以賦值吗C呢如:

那么输出的结果是什么呢?

我们来研究一下:int 在内存中存储占4个字节所以十进制256用二进制表示应该是

每一个地址代表一個存储单元。所以如果我们用一个指向int的不同类型指针可以赋值吗C来指向a那么这个不同类型指针可以赋值吗C其实是指向4个字节的,所以鈈同类型指针可以赋值吗C加一其实是加sizeof(int)现在我们把一个char*型的不同类型指针可以赋值吗C指向被我们强制转换成char*型的a。而char在内存中以单個字节存储那么虽然p存放的还是a的地址,但是p更精准的应该是指向a的第一个字节的内容所以*p对应(int)a中的第一个字节

这样理解上面的(char*)僦简单多了。(char*)a将原先指向(char *[3])强制转换成(char *)这样其实是缩小了步长(不知这么比喻是否合适),即原先指向3个字节强制转换成1个字节那么p就能接纳数组的首地址了。那么*++s实际上指向的是a[0][1]也就是“d”,而“d”-2 就是“b”

所以养成带类型运算的习惯真的很重要。

下面是类似的一噵题目:

那么下列表达式语法正确并且其值与 s[1][1]相等的表达式(并非一定与其等价)是

分析:这道题很好。首先字符型不同类型指针可以賦值吗Cp存放的是字符串s的首地址而字符串s表示的是这样一个字符串:

为了便于理解,“_”表示空格即没有元素。题中s[1][1]是d所以要在ABCD中尋找表示s[1][1]的数。

先来看*(s+3)s表示数组首地址,不是不同类型指针可以赋值吗C型变量,所以s+3没有意义p[1][1]同样由于p是不同类型指针可以赋值吗C,不存在这种表达*(p+3)是是p表示的不同类型指针可以赋值吗C后移3位,因此*(p+3)是cD选项有点复杂,*++p+2

我要回帖

更多关于 C和指针 的文章

 

随机推荐