搜索
bottom↓
回复: 29

请教个C语言指针问题

[复制链接]

出0入0汤圆

发表于 2019-7-13 16:25:11 | 显示全部楼层 |阅读模式
请教下  下面的这个表达式是啥意思?

short (*p)[size] = (short (*)[size])0x8ff00000;

是否为在0x8ff00000地址处分配size大小给p?

注:linux下运行

不胜感激~

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出100入113汤圆

发表于 2019-7-13 18:59:00 来自手机 | 显示全部楼层
不是,p是指针数组变量,变量具体存储在哪里,要看定义的位置。8ff00000是赋p的值。

出100入113汤圆

发表于 2019-7-13 19:02:55 来自手机 | 显示全部楼层
对于指针变量,32位系统,存储空间只有4字节。其指向的内存位置,要看你怎么用,不能说分配了多大空间,只能说p指向了8ff00000。

出10入0汤圆

发表于 2019-7-13 19:06:58 来自手机 | 显示全部楼层
楼上已经说的很清楚了。

出0入0汤圆

发表于 2019-7-13 19:23:14 | 显示全部楼层
楼上的楼上说得很清楚了

出0入0汤圆

发表于 2019-7-13 19:24:07 | 显示全部楼层
给指针赋初值

出0入0汤圆

 楼主| 发表于 2019-7-15 09:31:45 | 显示全部楼层
saccapanna 发表于 2019-7-13 19:02
对于指针变量,32位系统,存储空间只有4字节。其指向的内存位置,要看你怎么用,不能说分配了多大空间,只 ...

多谢~

既然如此 那么是不是可以不指定size 写成 short (*p)[size] = (short (*)[])0x8ff00000 ?

还有 再请教下

对于

int *p[3];                  // 数组指针变量?
int (*p)[3];        // 指针数组变量

这俩不太理解 觉得好像是同一个东西(可以混用?)

出100入113汤圆

发表于 2019-7-15 09:49:30 | 显示全部楼层
zhongjp85 发表于 2019-7-15 09:31
多谢~

既然如此 那么是不是可以不指定size 写成 short (*p) = (short (*)[])0x8ff00000 ?

是的,C指针很灵活,SIZE实际是不影响使用的,SIZE 如果是10,p[100]同样可用,越界了还是可以用的,这里指定SIZE至少有个说明提醒的作用,提醒使用者注意SIZE。至于下面指针数组和数组指针,存储空间上有区别,实际使用上也有些差别,比较另类的用法,代码中少用,或使用自己熟悉的表达方式,实在要用再查一下资料。一个人很难把所有的语言细节搞清楚。

出100入113汤圆

发表于 2019-7-15 09:56:54 | 显示全部楼层
saccapanna 发表于 2019-7-15 09:49
是的,C指针很灵活,SIZE实际是不影响使用的,SIZE 如果是10,p[100]同样可用,越界了还是可以用的,这里 ...

其实我的描述中也有问题,定义一个指针数组,如果SIZE为10,实际这个数组有10个成员变量,每个变量都是一个指针。楼主位的赋值方式,我其实也有点不确认是p[0]赋值了,还是整个指针数组都赋值了,这种情况我一般会这个小程序验证一下。很多语法细节我也不懂,还是建议少用另类的表达,尽量用自己明确的表达方式。

出0入93汤圆

发表于 2019-7-15 11:05:58 | 显示全部楼层
zhongjp85 发表于 2019-7-15 09:31
多谢~

既然如此 那么是不是可以不指定size 写成 short (*p) = (short (*)[])0x8ff00000 ?

int *p[3];           // 指针数组,含有三个元素,p[0]~p[2],每个元素都是int* 类型
int (*p)[3];         // 数组指针,含有一个元素p,该元素指向一个有三个元素的数组
您正好弄反了,而且含义完全不同

出0入0汤圆

发表于 2019-7-15 13:29:35 | 显示全部楼层
saccapanna 发表于 2019-7-13 18:59
不是,p是指针数组变量,变量具体存储在哪里,要看定义的位置。8ff00000是赋p的值。 ...

你说反了,这里的p是数组指针,而 int* p[size]才是指针数组,两者完全不同

出0入0汤圆

 楼主| 发表于 2019-7-15 15:39:39 | 显示全部楼层
phoenixson 发表于 2019-7-15 13:29
你说反了,这里的p是数组指针,而 int* p才是指针数组,两者完全不同

多谢~~~~~~~

出0入0汤圆

 楼主| 发表于 2019-7-15 15:40:07 | 显示全部楼层
phoenixson 发表于 2019-7-15 13:29
你说反了,这里的p是数组指针,而 int* p才是指针数组,两者完全不同

多谢了~~~~~~~~

出0入0汤圆

 楼主| 发表于 2019-7-15 15:41:07 | 显示全部楼层
saccapanna 发表于 2019-7-15 09:56
其实我的描述中也有问题,定义一个指针数组,如果SIZE为10,实际这个数组有10个成员变量,每个变量都是一 ...

多谢了

主要是在看别人代码  不是很理解为啥要这么写 哈哈~

出0入296汤圆

发表于 2019-7-15 20:04:17 来自手机 | 显示全部楼层
这就是不用typedef 导致 坑人的案例

出0入93汤圆

发表于 2019-7-15 20:15:17 | 显示全部楼层
Gorgon_Meducer 发表于 2019-7-15 20:04
这就是不用typedef 导致 坑人的案例

typedef 也是坑,所以现在C++都在提倡复杂声明使用using,可惜C没有这个语法。

出0入296汤圆

发表于 2019-7-15 20:33:40 | 显示全部楼层
takashiki 发表于 2019-7-15 20:15
typedef 也是坑,所以现在C++都在提倡复杂声明使用using,可惜C没有这个语法。 ...

typedef还好吧。你说的坑是啥?
有一些规则遵守好的话,typedef还是很好的。比如,不要用typedef来定义指针,而只是用typedef来定义原型——只要你遵守了这个原则,问题不会更糟糕的。

出100入113汤圆

发表于 2019-7-15 21:13:40 | 显示全部楼层
phoenixson 发表于 2019-7-15 13:29
你说反了,这里的p是数组指针,而 int* p才是指针数组,两者完全不同

谢谢回复,我就是感觉有点奇怪呢。如果是数组指针就完全没问题了。一般工作中用到这种情况,都会查一下C语法。

出0入93汤圆

发表于 2019-7-16 05:46:53 | 显示全部楼层
Gorgon_Meducer 发表于 2019-7-15 20:33
typedef还好吧。你说的坑是啥?
有一些规则遵守好的话,typedef还是很好的。比如,不要用typedef来定义指 ...

您要求的这些规则,就是只用typedef定义简单类型,确实是好用。C++的using就是要解决那些复杂声明,比如指针啊(尤其是函数指针)、数组啊,然后是C++自己的模板尤其是超级长的那种。
比如数组:
  1. int arr[8];
复制代码
typedef搞成这样
  1. typedef int arr_t[8];
复制代码
初学者谁知道这个arr_t是个int[8]?这就是坑。指针就更别说了。

using是这样的,这就一目了然了。
  1. using arr_t = int[8];
  2. using pint_t = int*;        // 指针别名
复制代码
函数指针稍微麻烦点

出0入0汤圆

 楼主| 发表于 2019-7-16 09:37:41 | 显示全部楼层
Gorgon_Meducer 发表于 2019-7-15 20:33
typedef还好吧。你说的坑是啥?
有一些规则遵守好的话,typedef还是很好的。比如,不要用typedef来定义指 ...

大佬来翻牌子了~

出0入0汤圆

发表于 2019-7-16 11:34:25 | 显示全部楼层
搬凳子学习

出0入296汤圆

发表于 2019-7-16 21:43:52 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2019-7-16 21:51 编辑
takashiki 发表于 2019-7-16 05:46
您要求的这些规则,就是只用typedef定义简单类型,确实是好用。C++的using就是要解决那些复杂声明,比如 ...


如果你只是说“=” 比较容易看懂……那这不过是一个宏的事情……

对初学者来说,学会typedef的语法是有必要的。C语言的缺陷是有目共睹的,但在你没法用C++的时候,typedef
就是一个不错的解决方案。如果抛开“限制条件”单纯谈哪个语言的哪个feature特别好……这个没法谈啊……肯定是
考虑在某种限制条件下——比如只能用C的情况下,如何做可以改善某个问题。

另外typedef处理函数指针也是非常好的。我说的不仅仅是简单类型,以函数指针为例:

1、首先定义函数原型
typedef bool read_byte_t (void *, uint8_t *);

2、然后用新类型 read_byte_t 定义指针,比如我们有一个函数

read_byte_t *get_interface(void *pTarget);

这就是直接把函数指针作为参数返回。这样,一看就知道是指针。

在复杂一点,我们可以继续定义函数指针:

typedef read_byte_t *get_interface_t (void *);

然后用 get_interface_t 定义函数指针,比如:

typedef struct {
    get_interface_t  *fnGetInterface;
} example_t;

这只是一个例子,说明typedef确实有帮助——但的确,刚开始学习它语法的时候看起来还是不太容易适应的——但这就是代价。
--------------------------

最后如果可以,还请不要用敬语。都是做技术的,平常讨论而已。

出0入0汤圆

发表于 2019-11-8 16:27:35 | 显示全部楼层
MARK    C语言多维数组指针与指针数组

出0入0汤圆

发表于 2019-11-9 09:52:06 来自手机 | 显示全部楼层
搞的太复杂了后期不好维护吧

出0入0汤圆

发表于 2019-11-9 14:24:51 | 显示全部楼层
来的时候感觉我会点C语言,离开时又觉得不会了

出0入0汤圆

发表于 2019-11-9 14:37:26 | 显示全部楼层
指向位于0x8ff00000的一个二维数组. 用p[row][column]就可以索引到数据了

出0入0汤圆

发表于 2019-11-9 15:17:27 | 显示全部楼层
takashiki 发表于 2019-7-15 11:05
int *p[3];           // 指针数组,含有三个元素,p[0]~p[2],每个元素都是int* 类型
int (*p)[3];       ...

我感觉使用指针数组和数组指针并不能很好的区分这两者的区别,
对于初学者,可以分别使用保存指针的数组和指向数组的指令来区分。

出0入0汤圆

发表于 2019-11-9 17:32:44 | 显示全部楼层
学习了~mark~~~

出0入0汤圆

发表于 2019-11-11 10:07:23 | 显示全部楼层
所以很遗憾,虽然学过C语言---大一的必修课。但是我从来都说自己不会,,,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-28 15:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表