打印

考大家一个结构体指针问题!

[复制链接]
2411|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hwk612167|  楼主 | 2012-11-6 17:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hwk612167 于 2012-11-7 09:39 编辑

typedef struct  _strA {
……
}strA, *pstrA;
问题是两个:
1、请问strA* 和pstrA 类型是否一样?
2、strA* 和pstrA否任何时候通用?

用结构体是不是有些迷惑人啊,在来个简单类型的
typedef unsigned char* INT8U_P;
typedef unsigned char INT8U;
问题两个:
1、请问INT8U* 和INT8U_P类型是否一样?
2、INT8U* 和INT8U_P否任何时候通用?

相关帖子

沙发
tianheyun| | 2012-11-6 23:39 | 只看该作者
我感觉strA* 是把任何地址强制转换成结构体指针,任何时候能用。*pstrA只是定义一个结构体指针需要给pstrA赋值才能用.

使用特权

评论回复
板凳
amwrdfe| | 2012-11-7 00:35 | 只看该作者
看不出来有区别,
展开得
pstra = struct _stra *,这里的pstra可不是变量,而是类型。
stra* = struct _star *

使用特权

评论回复
地板
ayb_ice| | 2012-11-7 08:14 | 只看该作者
是一样的

就象
typedef int *t_P;

t_P p;
int * p2;

一样的。。。

使用特权

评论回复
5
hwk612167|  楼主 | 2012-11-7 09:21 | 只看该作者
继续等~~~~~实际并不是任何时候都通用的,等人来答

使用特权

评论回复
6
hwk612167|  楼主 | 2012-11-7 09:40 | 只看该作者
可以肯定两者都是类型 2# tianheyun

使用特权

评论回复
7
ayb_ice| | 2012-11-7 09:51 | 只看该作者
没有看出什么不一样,只是书写的时候有些不一样,一个可以省略*而已。。。

使用特权

评论回复
8
joyme| | 2012-11-7 10:37 | 只看该作者
用结构体的那种,概念上是不一样的
*pstrA 是指向结构的指针变量,你不能用它来再定义一个新的变量
strA*是用来定义指针变量的,它不能直接当变量用
但后面那个typedef后的INT8U* 和INT8U_P应该是一样的
不知道定义指向指针的指针时,即后面多打几个*的情况,还要高手们分析一下(我写程序一般不用)

使用特权

评论回复
9
hwk612167|  楼主 | 2012-11-7 11:15 | 只看该作者
像结构体这种用法应该常见吧?  本质是一样的,struct和unsigned char 都是一种数据类型

使用特权

评论回复
10
hwk612167|  楼主 | 2012-11-7 11:16 | 只看该作者
而且INT8U* 和INT8U_P并不完全通用。。实验证明。

使用特权

评论回复
11
hwk612167|  楼主 | 2012-11-7 11:20 | 只看该作者
按我理解,其实应该完全一样,但我用多个编译器证明,它们却是不一样。

用修饰符const修饰时,做形参或函数返回,它们就不一样。
用const INT8U*形式,可以理解,指向的值不能改变,指针本身可变。
但用const INT8U_P形式,实际上却是指向的值可变,指针本身不可变。
大家可以写个简单代码测试下,,欢迎大侠来解释下原理何在???

使用特权

评论回复
12
amwrdfe| | 2012-11-7 12:00 | 只看该作者
typedef int* pint;
const int  *pa; 修饰的是*pa,pa只能指向int类型
const pint pb;  修饰的是pb,pb指向的地址不能变。
其实就是要搞明白const修饰的是什么

使用特权

评论回复
13
hwk612167|  楼主 | 2012-11-7 12:04 | 只看该作者
本帖最后由 hwk612167 于 2012-11-7 12:07 编辑

意思就是int*和pint不能完全等价 12# amwrdfe

使用特权

评论回复
14
hwk612167|  楼主 | 2012-11-7 12:08 | 只看该作者
我的意思是说 pint就是int*型,所以应该一样。此处const pint pb; 如果把int*带进去,就是修饰*pb了,为什么呢。
实际上amwrdfe 解释的很对。。只是觉得很别扭不易理解。

使用特权

评论回复
15
amwrdfe| | 2012-11-7 12:11 | 只看该作者
这个问题不如说是typedef的#define的区别。
#define和内联函数一样,都是直接展开,
typedef是替换整体,
假如这么定义
#define pint int*
const int *pa;
const pint pb;
就没有任何区别了。

使用特权

评论回复
16
原野之狼| | 2012-11-7 12:42 | 只看该作者
本帖最后由 原野之狼 于 2012-11-7 12:48 编辑

char、unsigned char、int、long等等是基本类型,使用typedef可以定义出扩展的类型,该类型与基本类型本质上是一样的。

而int *p之类,它仅仅是一种写法,意义很明确:

1. int是一个类型。
2. p是变量名。
3. 加*号表明p是指针变量,其指向int类型的变量,再次强调,这仅仅是一种写法,此时在你的逻辑里你应该认为没有int*这种类型(她还没有产生出来)。

正因为如此,以下两条语句意义截然不一样。
  int *p1,p2;  //p1是指针变量,p2是整形变量。
  int *p1,*p2; // p1和p2都是指针变量。

当typedef int *P_INT之后,才扩展出了新的类型,即P_INT类型,我们写几条语句看看:
  P_INT p1,p2; // p1和p2都是P_INT类型的变量
  P_INT *p1, p2; //p1是指针变量,p2是P_INT类型的变量。
  P_INT *p1,*p2; // p1和p2都是指针变量。
再罗嗦一句:以上两条语句加了*号,这仅仅是一种写法

当然还可以接着typedef P_INT *PP_INT,此时又造出了一种新的类型PP_INT,怎么用就不再赘述了。

再补充几点:

1.关于const的简单用法

声明为常量,可以有两种写法:
const int a;
int const a;
其实它们是一样的。

以上两条语句包含3要素:
a) const限定符
b) 类型名int,该类型名可以是基本类型(比如int,char,long...),也可以是typedef扩展的类型。
c) 变量名a

依据b)的说法,我们可以再写几条语句:
const P_INT a;
P_INT const a;
以上两条语句等价,均表示变量a为常量。

备注:以上写法其实是有问题的,因为const变量在定义时就得进行初始化,除非是作为函数参数使用。

2.关于const的复杂用法

那就是把指针添加上。

举例:
const int *p;
int const *p;
int * const p;  // 需要在定义时进行初始化
const int * const p;  // 需要在定义时进行初始化
int const * const p;  // 需要在定义时进行初始化

以上语句包含5要素:
a) 类型名int,该类型名可以是基本类型(比如int,char,long...),也可以是typedef扩展的类型。
b) 变量名p
c) *符号,该符号表明变量p是指针变量,同之前讲的一样,仅仅是一种写法。
d) 用于修饰变量p的const限定符号,表明p是常量。
e) 用于修饰类型int的const限定符号,表明p指向的变量是常量。

有以上1、2两部分知识点,就很容易理解11楼提到的问题了:
INT8U_P是类型,其满足1部分提到的模型。
INT8U*是一种写法,其满足2部分提到的模型。

3. 关于指针

本文或者其它**经常提到指针一词,其根据上下文具有两种不同的意义:
a) 指针变量,作为变量来理解,“指针”是修饰词,表明该变量是一个指针类型的变量。
b) 指针类型,作为类型来理解。c语言包括两种类型,一个是基本类型以及typedef出来的扩展类型,另一个是指针类型。

在编程时,以上两种表达,都可以用sizeof()在编译期求得变量或类型的尺寸,对于32位机器:
a)  sizeof(指针变量) == 4
b)  sizeof(指针类型) == 4

使用特权

评论回复
17
hwk612167|  楼主 | 2012-11-7 12:47 | 只看该作者
不说const,就所提问题1、2不知道有多少人要答错呢?
谢谢大家的答复,这下**更深刻了。
有时候看着似乎是明白了是一回事,用着又是另外一回事。

使用特权

评论回复
18
原野之狼| | 2012-11-7 12:51 | 只看该作者
在理解书本的前提下再上机编程测试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:前进 前进 前进

20

主题

511

帖子

3

粉丝