| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1929 人关注过本帖
标题:c语言指针问题--非高手勿进
只看楼主 加入收藏
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
收藏
得分:1 
我要向管理员投诉你歧视
2010-12-03 22:39
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:1 
汗,菜鸟路过,标题如其人
2010-12-03 22:41
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
以下是引用wujieru在2010-12-3 17:28:03的发言:

我不是高手 就进了 你能怎么样

顶你这次
2010-12-03 22:41
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:1 
这个题目也找抽

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-12-03 23:27
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:1 
我只是想告诉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))
volatile 该关键字声明的变量不会被编译器优化(说白了就是不让编译器把它放进寄存器里(多线程里有用:被几个线程共享的变量))
(volatile uint *) 强制转换为不会被编译器优化无符号int型的指针
*((volatile uint *) (ICU_BASE + 0x0480)) 把宏ICU_BASE + 0x0480的值(两值相加后编译器优化为int型),再强制转换为一个不会被编译器优化无符号int型的常指针
最后(由于是指向单个数据单位的指针) 取得了ICU_BASE + 0x0480这个地址开始的后4个字节里的值并解析为unsigned int 型

My life is brilliant
2010-12-04 00:20
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))
volatile 该关键字声明的变量不会被编译器优化(说白了就是不让编译器把它放进寄存器里(多线程里有用:被几个线程共享的变量))
(volatile uint *) 强制转换为不会被编译器优化无符号int型的指针
*((volatile uint *) (ICU_BASE + 0x0480)) 把宏ICU_BASE + 0x0480的值(两值相加后编译器优化为int型),再强制转换为一个不会被编译器优化无符号int型的常指针
最后(由于是指向单个数据单位的指针) 取得了ICU_BASE + 0x0480这个地址开始的后4个字节里的值并解析为unsigned int 型

My life is brilliant
2010-12-04 00:21
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:31
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:32
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:32
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:34
快速回复:c语言指针问题--非高手勿进
数据加载中...
 
   



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

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