注册 登录
查看: 446|回复: 17

结构体指针的一些问题!求解答!

[复制链接]
发表于 2014-10-25 15:15:20 | 显示全部楼层 |阅读模式
int * p;
p = (int *) 1;
这个是定义一个指针p;
p指向的内存地址为0x1;

PORT_MemMapPtr  p = ((PORT_MemMapPtr)0x40049000u);
p->GPCLR;
这个是定义一个结构体指针p;
指针p指向的内存地址为0x40049000

不明白的地方是
typedef struct PORT_MemMap
{
uint32_t PCR[32];
uint32_t GPCLR;
uint32_t GPCHR;
uint8_t  RESERVRD_0[24];
uint32_t ISFR;
uint8_t  RESERVRD_1[28];
uint32_t DFCR;
uint32_t DFWR;
}volatile *PORT_MemMapPtr;

*PORT_MemMapPtr  是 typedef 给结构体 PORT_MemMap 定的一个别名;
强制类型转换后,PORT_MemMapPtr是新定义的一个结构体指针类型 !
PORT_MemMapPtr类似于int*!!而不是*PORT_MemMapPtr!!对吧!?

p = ((PORT_MemMapPtr)0x40049000u);
结构体指针p指向内存地址0x40049000
p->GPCLR;的话指向内存地址0x40049080  对吧!
不明白的就是->这个运算符的用法!没用过!
还有 p -> GPCLR;和 (*p).GPCLR; 有什么区别!
结果运行的是一样的!但是具体的原理还是不明白!


原谅我吧!不知道为什么家里的台式电脑查代码查不进来!
附带一问!地址后面的u什么含义!?无字符型?

回复

使用道具 举报

发表于 2014-10-25 15:20:40 | 显示全部楼层
结构体指针,是用 -> 符号,而结构体普通变量是用 . 符号。
假设 t 是结构体类型,包含成员A。
那么 :
t  g;
g.A;  这里就用 . 符号。

如果 :
t * k;
k->A; 由于k是指针,因此不能再用 .  符合,而是改成 -> 符号。

为什么不像普通的指针那样用 * 符号呢?
要是这样的话, *k.A ,到底是取A的内容还是取k的内容呢?就会有所混淆。
回复 支持 反对

使用道具 举报

发表于 2014-10-25 15:21:57 | 显示全部楼层
其实,你是不熟悉结构体指针的用法。这部分的内容,谭浩强的C语言也是有讲的。

p -> GPCLR;和 (*p).GPCLR;  两者都是一样的意思。
回复 支持 反对

使用道具 举报

发表于 2014-10-25 15:23:19 | 显示全部楼层
u 表示 unsigned ,表示无符号整型。(默认是整型变量)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-25 15:23:32 | 显示全部楼层
山外メ雲ジ 发表于 2014-10-25 15:20
结构体指针,是用 -> 符号,而结构体普通变量是用 . 符号。
假设 t 是结构体类型,包含成员A。
那么 :

恩啊!就是这*号给我弄蒙了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-25 15:25:08 | 显示全部楼层
山外メ雲ジ 发表于 2014-10-25 15:20
结构体指针,是用 -> 符号,而结构体普通变量是用 . 符号。
假设 t 是结构体类型,包含成员A。
那么 :

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>

typedef struct stu
{
    int num;
    char *name;
    char sex;
    float score;
}*pstu;
main()
{
stu boy1={102,"Zhang ping",'M',78.5};
    pstu p;
  p = &boy1;
    printf(" Number = %d  \n Name = %s   \n", boy1.num, boy1.name);
    printf(" Sex = %c     \n Score = %f  \n\n", boy1.sex, boy1.score);
    printf(" Number = %d  \n Name = %s   \n", (*p).num,(*p).name );
    printf(" Sex = %c     \n Score = %f  \n\n", (*p).sex,(*p).score );
    printf(" Number = %d  \n Name = %s   \n", p->num, p->name );
    printf(" Sex = %c     \n Score = %f  \n\n", p->sex, p->score);
     
    system("pause");
}


这个例子!char *name; 输出用两种也都可行!
回复 支持 反对

使用道具 举报

发表于 2014-10-25 15:33:40 | 显示全部楼层

(*p). name
这里 *p ,已经转变为非指针了,所以可以用 . 符号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-25 21:13:16 | 显示全部楼层
山外メ雲ジ 发表于 2014-10-25 15:33
(*p). name
这里 *p ,已经转变为非指针了,所以可以用 . 符号

山外哥!这里*p的含义是什么?
回复 支持 反对

使用道具 举报

发表于 2014-10-25 21:28:09 | 显示全部楼层
ii童话Bū说话 发表于 2014-10-25 21:13
山外哥!这里*p的含义是什么?

这个就是一个 指针取内容而已吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-25 22:24:38 | 显示全部楼层
山外メ雲ジ 发表于 2014-10-25 15:33
(*p). name
这里 *p ,已经转变为非指针了,所以可以用 . 符号

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>

typedef struct stu
{
    int num;
    char *name;
    char sex;
    float score;
}pstu;
main()
{
stu boy1={102,"Zhang ping",'M',78.5};
    pstu *p;
  p = &boy1;
    printf(" Number = %d  \n Name  = %s  \n", boy1.num, boy1.name);
    printf(" Sex    = %c  \n Score = %f  \n\n", boy1.sex, boy1.score);
    printf(" Number = %d  \n Name  = %s  \n", (*p).num,(*p).name );
    printf(" Sex    = %c  \n Score = %f  \n\n", (*p).sex,(*p).score );
    printf(" Number = %d  \n Name  = %s  \n", p->num, p->name );
    printf(" Sex    = %c  \n Score = %f  \n\n", p->sex, p->score);
     
    system("pause");
}



山外哥!指点一下!这个和上面的区别在哪里?就是p和*p!
貌似这种用法很符合我之前用的逻辑!!

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-27 12:29:54 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdint.h>

  4. typedef struct stu
  5. {
  6.     int num;
  7.     char *name;
  8.     char sex;
  9.     float score;
  10. }*pstu;
  11. main()
  12. {
  13. stu boy1={102,"Zhang ping",'M',78.5};
  14.     pstu p;
  15.   p = &boy1;
  16.     printf(" Number = %d  \n Name = %s   \n", boy1.num, boy1.name);
  17.     printf(" Sex = %c     \n Score = %f  \n\n", boy1.sex, boy1.score);
  18.     printf(" Number = %d  \n Name = %s   \n", (*p).num,(*p).name );
  19.     printf(" Sex = %c     \n Score = %f  \n\n", (*p).sex,(*p).score );
  20.     printf(" Number = %d  \n Name = %s   \n", p->num, p->name );
  21.     printf(" Sex = %c     \n Score = %f  \n\n", p->sex, p->score);
  22. }



上面的代码!和下面的代码!含义应该不同吧!!求解释!

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdint.h>

  4. typedef struct stu
  5. {
  6.     int num;
  7.     char *name;
  8.     char sex;
  9.     float score;
  10. }pstu;
  11. main()
  12. {
  13. stu boy1={102,"Zhang ping",'M',78.5};
  14.     pstu *p;
  15.   p = &boy1;
  16.     printf(" Number = %d  \n Name  = %s  \n", boy1.num, boy1.name);
  17.     printf(" Sex    = %c  \n Score = %f  \n\n", boy1.sex, boy1.score);
  18.     printf(" Number = %d  \n Name  = %s  \n", (*p).num,(*p).name );
  19.     printf(" Sex    = %c  \n Score = %f  \n\n", (*p).sex,(*p).score );
  20.     printf(" Number = %d  \n Name  = %s  \n", p->num, p->name );
  21.     printf(" Sex    = %c  \n Score = %f  \n\n", p->sex, p->score);
  22. }



PS:回学校了!还是自己的笔记本用着High!!!
回复 支持 反对

使用道具 举报

发表于 2014-10-27 13:03:20 | 显示全部楼层
ii童话Bū说话 发表于 2014-10-27 12:29
上面的代码!和下面的代码!含义应该不同吧!!求解释!

那么长的代码,没看出哪里是不同的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-27 13:18:50 | 显示全部楼层
羿梅 发表于 2014-10-27 13:03
那么长的代码,没看出哪里是不同的。


定义的时候一个是
  1. typedef struct stu
  2. {
  3. }*pstu;
另一个是
  1. typedef struct stu
  2. {
  3. }pstu;
后面用的时候一个是 pstu *p;
另一个是 pstu *p;
回复 支持 反对

使用道具 举报

发表于 2014-10-27 13:23:01 | 显示全部楼层
ii童话Bū说话 发表于 2014-10-27 13:18
定义的时候一个是
另一个是
后面用的时候一个是 pstu *p;

一个用隐式指针,另外一个用显式指针,一样的 意义。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-27 13:50:33 | 显示全部楼层
仰逸致 发表于 2014-10-27 13:23
一个用隐式指针,另外一个用显式指针,一样的 意义。

我说一下帮忙看看说的对不对哈!谢谢了!

  1. typedef struct stu
  2. {
  3. }pstu;
定义的pstu是struct stu的别名  类似于int  这是一个显式指针

pstu *p;  类似于  int *p;

/*******************************************************************************/

  1. typedef struct stu
  2. {
  3. }*pstu;
上面这个是定义了一个隐式指针, pstu是stryct stu * 的别名,这时候pstu类似于 int *
  1. pstu p;

pstu p;  类似于  (int*)  p;







回复 支持 反对

使用道具 举报

发表于 2014-10-27 14:00:37 | 显示全部楼层
ii童话Bū说话 发表于 2014-10-27 13:50
我说一下帮忙看看说的对不对哈!谢谢了!

定义的pstu是struct stu的别名  类似于int  这是一个显式指 ...

是,就是起了个别名,隐式了指针而已。都是一样的意思。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-27 14:03:38 | 显示全部楼层
仰逸致 发表于 2014-10-27 13:23
一个用隐式指针,另外一个用显式指针,一样的 意义。

多谢指教!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-27 14:04:04 | 显示全部楼层
山外メ雲ジ 发表于 2014-10-27 14:00
是,就是起了个别名,隐式了指针而已。都是一样的意思。

谢啦!山外哥!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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