| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1929 人关注过本帖
标题:c语言指针问题--非高手勿进
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
我只想告诉7楼 * (除了指向单个数据单位的指针外) 是解除引用的意思,并不是取里面的值
例:
程序代码:
#include <iostream>

int main()
{
    const int (* const p)[4] = new int[2][4];   
    std::cout<< "p = " << p << "\tp + 1 = " << p + 1 <<std::endl;
    //由于p所指向数组的元素为4个int类型,所以加1会增加4 * sizeof(int)个字节
    std::cout<< "*p = " << *p << "\t*p + 1 = " << *p + 1 << std::endl;
    //*p会解除一级引用,其性质不是取里的内容,而是使其指向一个元素为1个int类型的数组,加1只会扩展1 * sizeof(int)个字节
    delete [] p;
    system("pause");
    return 0;
}
*((volatile uint *) (ICU_BASE + 0x0480)) //这句的意思是把宏ICU_BASE + 0x0480的值(编译器优化为int型)强制转换为不会被编译器优化无符号int型的常指针
//由于该指针是指向单个数据单位的指针,所以是获得了以ICU_BASE + 0x0480这个内存地址开始的4个字节的内容,并解析为unsigned int 型

My life is brilliant
2010-12-04 00:35
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
我只想告诉7楼 * (除了指向单个数据单位的指针外) 是解除引用的意思,并不是取里面的值
例:
程序代码:
#include <iostream>

int main()
{
    const int (* const p)[4] = new int[2][4];   
    std::cout<< "p = " << p << "\tp + 1 = " << p + 1 <<std::endl;
    //由于p所指向数组的元素为4个int类型,所以加1会增加4 * sizeof(int)个字节
    std::cout<< "*p = " << *p << "\t*p + 1 = " << *p + 1 << std::endl;
    //*p会解除一级引用,其性质不是取里的内容,而是使其指向一个元素为1个int类型的数组,加1只会扩展1 * sizeof(int)个字节
    delete [] p;
    system("pause");
    return 0;
}
*((volatile uint *) (ICU_BASE + 0x0480)) //这句的意思是把宏ICU_BASE + 0x0480的值(编译器优化为int型)强制转换为不会被编译器优化无符号int型的常指针
//由于该指针是指向单个数据单位的指针,所以是获得了以ICU_BASE + 0x0480这个内存地址开始的4个字节的内容,并解析为unsigned int 型

My life is brilliant
2010-12-04 00:37
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
我只想告诉7楼 * (除了指向单个数据单位的指针外) 是解除引用的意思,并不是取里面的值
例:
#include <iostream>

int main()
{
    const int (* const p)[4] = new int[2][4];   
    std::cout<< "p = " << p << "\tp + 1 = " << p + 1 <<std::endl;
    //由于p所指向数组的元素为4个int类型,所以加1会增加4 * sizeof(int)个字节
    std::cout<< "*p = " << *p << "\t*p + 1 = " << *p + 1 << std::endl;
    //*p会解除一级引用,其性质不是取里的内容,而是使其指向一个元素为1个int类型的数组,加1只会扩展1 * sizeof(int)个字节
    delete [] p;
    system("pause");
    return 0;
}
 *((volatile uint *) (ICU_BASE + 0x0480)) //这句的意思是把宏ICU_BASE + 0x0480的值(编译器优化为int型)强制转换为不会被编译器优化无符号int型的常指针
//由于该指针是指向单个数据单位的指针,所以是获得了以ICU_BASE + 0x0480这个内存地址开始的4个字节的内容,并解析为unsigned int 型

My life is brilliant
2010-12-04 00:37
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
我只想告诉7楼 * (除了指向单个数据单位的指针外) 是解除引用的意思,并不是取里面的值
例:
#include <iostream>

int main()
{
    const int (* const p)[4] = new int[2][4];   
    std::cout<< "p = " << p << "\tp + 1 = " << p + 1 <<std::endl;
    //由于p所指向数组的元素为4个int类型,所以加1会增加4 * sizeof(int)个字节
    std::cout<< "*p = " << *p << "\t*p + 1 = " << *p + 1 << std::endl;
    //*p会解除一级引用,其性质不是取里的内容,而是使其指向一个元素为1个int类型的数组,加1只会扩展1 * sizeof(int)个字节
    delete [] p;
    system("pause");
    return 0;
}
 *((volatile uint *) (ICU_BASE + 0x0480)) //这句的意思是把宏ICU_BASE + 0x0480的值(编译器优化为int型)强制转换为不会被编译器优化无符号int型的常指针
//由于该指针是指向单个数据单位的指针,所以是获得了以ICU_BASE + 0x0480这个内存地址开始的4个字节的内容,并解析为unsigned int 型

My life is brilliant
2010-12-04 00:39
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
我只想告诉7楼 * (除了指向单个数据单位的指针外) 是解除引用的意思,并不是取里面的值
例:
#include <iostream>

int main()
{
    const int (* const p)[4] = new int[2][4];   
    std::cout<< "p = " << p << "\tp + 1 = " << p + 1 <<std::endl;
    //由于p所指向数组的元素为4个int类型,所以加1会增加4 * sizeof(int)个字节
    std::cout<< "*p = " << *p << "\t*p + 1 = " << *p + 1 << std::endl;
    //*p会解除一级引用,其性质不是取里的内容,而是使其指向一个元素为1个int类型的数组,加1只会扩展1 * sizeof(int)个字节
    delete [] p;
    system("pause");
    return 0;
}
 *((volatile uint *) (ICU_BASE + 0x0480)) //这句的意思是把宏ICU_BASE + 0x0480的值(编译器优化为int型)强制转换为不会被编译器优化无符号int型的常指针
//由于该指针是指向单个数据单位的指针,所以是获得了以ICU_BASE + 0x0480这个内存地址开始的4个字节的内容,并解析为unsigned int 型

My life is brilliant
2010-12-04 00:39
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:1 
就一个强制地址应用,还需要高手来解答。

without further ado, let’s get started
2010-12-04 00:41
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
我只想告诉7楼 * (除了指向单个数据单位的指针外) 是解除引用的意思,并不是取里面的值
例:
程序代码:
#include <iostream>

int main()
{
    const int (* const p)[4] = new int[2][4];   
    std::cout<< "p = " << p << "\tp + 1 = " << p + 1 <<std::endl;
    //由于p所指向数组的元素为4个int类型,所以加1会增加4 * sizeof(int)个字节
    std::cout<< "*p = " << *p << "\t*p + 1 = " << *p + 1 << std::endl;
    //*p会解除一级引用,其性质不是取里的内容,而是使其指向一个元素为1个int类型的数组,加1只会扩展1 * sizeof(int)个字节
    delete [] p;
    system("pause");
    return 0;
}
*((volatile uint *) (ICU_BASE + 0x0480)) //这句的意思是把宏ICU_BASE + 0x0480的值(编译器优化为int型)强制转换为不会被编译器优化无符号int型的常指针
//由于该指针是指向单个数据单位的指针,所以是获得了以ICU_BASE + 0x0480这个内存地址开始的4个字节的内容,并解析为unsigned int 型

My life is brilliant
2010-12-04 00:43
落拓
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:58
专家分:173
注 册:2010-9-29
收藏
得分:1 
(volatile uint *) (ICU_BASE + 0x0480) 是强制类型转换,不仅变量可以被强制类型转换,常数也行的。我们经常用的 NULL 就是把 0 强制转换成void 型 指针。不信的话可以查看VC里面的NULL定义。(编译好一个含有NULL的程序后,把光标移到NULL那里,右击,选择“转到 NULL 的定义” ,就可以看到了。)  它的定义是:#define NULL    ((void *)0)。

ICU_BASE + 0x0480 是一个常数。也是可以被强制转换的。转换后,(volatile uint *) (ICU_BASE + 0x0480) 就变成了一个指向 地址为 (ICU_BASE + 0x0480) 的指针。要使用这个地址上的值,就要在前面加 * 。

估计楼主也理解了,在《C陷阱与缺陷》中有这样一句语句: (*(void(*)())0)(); 吓人吧。楼主好好研究一下,最好看看这本书。很有用的。
2010-12-04 09:52
jiuopkl
Rank: 1
等 级:新手上路
帖 子:9
专家分:1
注 册:2010-11-17
收藏
得分:1 
我手贱,你能怎么样呢
2010-12-04 10:00
xx123321
Rank: 1
等 级:新手上路
帖 子:7
专家分:7
注 册:2010-12-1
收藏
得分:1 
我可以很肯定的說:
"樓主永遠都是菜鳥"
2010-12-04 20:03
快速回复:c语言指针问题--非高手勿进
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014798 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved