C语言的题目,求助!!!

已知
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char*)0x801000;
p2=(unsigned long*)0x810000;
请问 p1+5=? p2+5=? 要求算出结果并编程验证

#include <stdio.h>

int main(int argc, char *argv[])

{

 unsigned char *p1;

 unsigned long *p2;

 p1=(unsigned char*)0x801000;

 p2=(unsigned long*)0x810000;

 printf("p1=%x\tp2=%x\n",p1,p2);

 printf("p1+5=%x\tp2+5=%x\n",p1+5,p2+5);

 return 0;

解释:

unsigned char *p1;所以p1占一个字节,

而unsigned long *p2;p2占4个字节;

所以p1后移5个单位后就是801005;

而p2后移5个单位就是20个位移量,换成16进制也就是14,因此是810014

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-23
你好!!
#include<stdio.h>
void main()
{
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char*)0x801000;
p2=(unsigned long*)0x810000;

printf("p1=%x\n",p1);
printf("p2=%x\n",p2);

p1=p1+5;
p2=p2+5;

printf("p1+5=%x\n",p1);
printf("p2+5=%x\n",p2);

}
结果:
p1=801000
p2=810000
p1+5=801005
p2+5=810014
Press any key to continue

解释:
p1=(unsigned char*)0x801000;
是给指针变量赋值,即把十六进制0x801000放到字符指针变量中,即指针变量p1的值就是0x801000

p2=(unsigned long*)0x810000;也是给指针变量赋值,同上

输出结果p1+5的值是801005,因为指针变量指向的值字符,加一表示指针向后移动一个字节,那么加5代表向后移动5个字节,所以输入801005

p5+5的值是801016,因为指针变量指向的长整形的,加一表示指针向后移动4个字节,那么加5代表向后移动20个字节,所以输入810014,(输出时十六进制)要是十进制就是810020了本回答被提问者采纳
第2个回答  2013-05-29
int a[5]={2,4,6,8,10},*P,* *k;这句话等价于

int a[5]={2,4,6,8,10};
int *P;
int **k;

这三句。

a是一个数组
p是一个int指针
k是一个指向int指针的指针

p=a; //p指向a数组的首地址
k=&p; //取p指针的地址给k。

printf("%d",*(p++));//p++表达式返回的是当前的p值,即数组首地址。解引用后实际上输出的是a[0]
输出为2
但是输出完了之后其实p要自增,指向a[1]

printf("%d\n",* *k);//* *k等价于*(*k)。对k解引用为p。所以*(*k)等价于*p。这时p指向的是a[1]
所以输出为4

总结输出为24
第3个回答  2012-02-29
1.1 printf("%d",&a);
1.2 不能,编译时就确定了
1.3 p+2指p的值加上2*p所指向数据类型的字节数
1.4 不可以,数组名是一个地址
1.5 int argc, char * argv[] 是main函数的形参,其实参是操作系统给出或由执行文件的命令一同给出
1.6 8 可以不包含结束符
1.7 不可以
1.8 宏定义就是用一个名字代替一个字符串,简单置换 #define XXX xxx
1.9 结果出错 它们是常量
1.10 \n换行 \t移动到下一个tab位置 \b后退一格
1.11 可以 但a b必须为同类结构体变量
1.12 i++:先使用i,然后i的值加1,++i:先使i+1,在使用i
1.13 栈 一种数据结果 先进后出原则存储数据 数组 是一类数据类型 许多变量有序的排列起来
1.14 分配在内存的静态存储区 在函数调用时才分配空间,函数调用结束后仍保留,程序结束时释放
1.15 \0
第4个回答  2012-02-29
1 int a,*p=&a;然后输出printf("%ld",long(p))
2 int a[10]; 10为常量表达式,它可以包含常量和符号常量,不能包含变量.也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值.例:
下面这样定义数组大小是不行的:
int n;
scanf("%d",&n);//在程序中临时输入数组的大小
int a[n];
3 int a[10] ,*p; p=&a[0]; 而 p+2和a+2一样都是a[2]的地址
4 不能, a 实际上就是a[0] a++ 相当于对a[0]而对别的数据无作用
5 不就是定义一个 整形变量argc和一个字符型指针数组argv[
6 9
7可以 int a[3]={0,1,2,3}
8 一般形式 #define 标识符 字符串 用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量.
9 两个十六进制数
10 \n换行,将当前位置移到下一行开头\t跳到下一个Tab位置\b退格,将当前们置移到前一列
11结构体a和b它们的成员表列都不同,怎么整体赋值
12 ++i 在使用i之前,先使i 的值加1 i++在使用i之后,使i 的值加1
13 数组是有序数据的集合.数组每一个元素都属于同一个数据类型. 栈是限定仅在表尾进行插入或删除操作的线性表. 后进先出
14 静态存储区
15 \0
累啊,感觉自己翻一下书就可以啊