《C语言解惑》—— 2.9 输出值的操作符

2.9 输出值的操作符

在例2.11中,既然&a[i]表示数组a的各个元素的地址,这些地址存储相应数组元素的值,就应该能直接将这些值输出。
【例2.13】使用“*”操作符输出数组内容。

#include <stdio.h>
void main ( )
{
     int a[3]={1,2,3};
     int i=0;
     //输出数组地址
     for(i=0;i<3;i++)
         printf("0x%p ",&a[i]);
     printf("\n");
     //输出数组内容
     for(i=0;i<3;i++)
         printf("%d ",*&a[i]);
     printf("\n");
}

地址用十六进制输出,地址里的内容采用在地址前加“*”号的方法输出。输出结果如下。
0x0012FF74 0x0012FF78 0x0012FF7C
1 2 3
上面演示了对数组的地址使用“”操作的方法。如果用变量存储一个有效的地址,例如整型变量addr存储整型变量a的地址,能用“ addr”输出变量a的值吗?下面就通过程序来看看是否可行。
【例2.14】分析程序中存在的错误。

#include <stdio.h>
int main()
{
     int a=25;
     int addr;
     addr=&a;
     printf("分配给变量a的地址0x%d\n",&a);
     printf("addr的地址值=0x%p\n",addr);        //输出addr的值
     printf("addr地址里的内容=%d\n",*addr);    //输出addr的内容
     return 0;
}

编译给出一个错误信息和一个警告信息。
warning C4047: '=' : 'int ' differs in levels of indirection from 'int *'
error C2100: illegal indirection
因为addr是整型变量,&a是地址值,所以造成语句“=”两边的数据类型不匹配。可以对地址值使用int进行强制转换以解决不匹配问题,即使用语句
addr=(int)&a;
将地址转换成整型数值,完成“=”两边的匹配,这样就解决了编译时的警告信息。
直接对&a使用“*”,输出正确。但对addr出错,显然也是表达方式不匹配。使用强制转换,改用
printf("addr地址里的内容=%dn",(int*)addr);
编译正确,输出结果如下。
分配给变量a的地址0x1245052
addr的地址值=0x0012FF7C
addr地址里的内容=1245052
虽然输出结果不对,但有了解决办法。“1245052”就是addr的十进制地址,所以对这个地址使用“*”操作符即可。
因为语句“addr=(int)&a;”将地址强制转换成 int 类型值的地址,所以不能直接使用“addr”,需要使用“(int)addr”再将其转换成存储的地址值。程序的输出结果也证实了它就是变量a的地址,也就是存储在addr变量里的地址。这时再对它使用“(int)addr”,就能输出存储在addr地址里的值了。
//改正后的正确程序

#include <stdio.h>
int main()
{
     int a=25;
     int addr;
     addr=(int)&a;
     printf("分配给变量a的地址0x%d\n",&a);
     printf("addr的地址值=0x%p\n",addr);            //输出addr的值
     printf("addr地址里的内容=%d\n",*&a);            //输出addr的值
     printf("addr地址里的内容=%d\n",*(int*)addr);        //输出addr的内容
     return 0;
}

输出结果如下。
分配给变量a的地址0x1245052
addr的地址值=0x0012FF7C
addr地址里的内容=25
addr地址里的内容=25
显然,把变量a的地址直接赋给变量addr,效果是一样的。
【例2.15】直接将地址赋给变量的例子。

#include <stdio.h>
int main()
{
     int a=25;
     int addr;
     addr=(int)0x0012FF7C;
     printf("分配给变量a的地址0x%d\n",&a);
     printf("addr的地址值=0x%p\n",addr);            //输出addr的值
     printf("addr地址里的内容=%d\n",*&a);            //输出addr的值
     printf("addr地址里的内容=%d\n",*(int*)addr);        //输出addr的内容
     return 0;
}

运行结果相同,不再给出。

时间: 2024-08-01 19:39:26

《C语言解惑》—— 2.9 输出值的操作符的相关文章

《C语言解惑》一第1章 操作符1.1 基本算术操作符

第1章 操作符 C语言解惑 C语言程序由语句构成,而语句由表达式构成,表达式又由操作符和操作数构成.C语言中的操作符非常丰富--本书的附录B所给出的操作符汇总表就是最好的证据.正是因为这种丰富性,为操作符确定操作数的规则就成为了我们理解C语言表达式的核心和关键.那些规则--即所谓的"优先级"和"关联性"--汇总在本书附录A的操作符优先级表里.请使用该表格来解答本章中的谜题. 谜题1.1 基本算术操作符 请问,下面这个程序的输出是什么? main() { int x;

《C语言解惑》一1.6 操作符的优先级和求值顺序

谜题1.6 操作符的优先级和求值顺序 请问,下面这个程序的输出是什么? define PRINT3(x,y,z) \ printf(#x "=%d\t" #y "=%d\t" #z "=%d\n",x,y,z) main() { int x, y, z; x = y = z = 1; ++x || ++y && ++z; PRINT3(x,y,z); (1.6.1) x = y = z = 1; ++x && ++

《C语言解惑》—— 导读

前 言 C语言编程仍然是编程工作者必备的技能.目前有四类典型的学习C语言的教材:第一类是以讲授语法为主线,即流行的教科书方式,所涉及的例题均以正确的程序为主:第二类是以案例教学为主的教材,摆脱了语法的部分约束:第三类是以讲解编程技术为主的经验之作,主要针对已有编程基础的读者:第四类是针对编程容易产生错误的专题,对比正确与错误的程序以提高编程能力,涉及的内容比较专业.这些教材各有千秋,其共同的目的都是想教会读者如何编写正确.规范的程序.我们也曾在两部教材的每一章中尝试增加一节错误分析的内容,以期让

c语言-华为C语言面试题目,输出内容的值

问题描述 华为C语言面试题目,输出内容的值 11.写出下列代码的输出内容 #include int inc(int a) { return(++a); } int multi(int*a,int*b,int*c) { return(*c=*a**b); } typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) { INCp=&inc; int

《C语言解惑》一导读

前言 C语言解惑 C语言并不大--如果以参考手册的篇幅作为衡量标准的话,C语言甚至可以归为一种"小"语言.不过,这种"小"并不意味着C语言的功能不够强大,而是说明了C语言里的限制性规则比较少.C语言本身的设计非常简洁精妙,这一点相信C语言的使用者早已有所体会. 不过,C语言的这种精妙对C语言的初学者来说,似乎是故作神秘.因为限制较少,C语言可以写成内容丰富的表达式,这可能会被初学者认为是输出错误.C语言的紧凑性允许以简洁凝炼的方式实现常见的编程任务. 学用C语言的过

c语言多线程运行后为什么值会变成这样

问题描述 c语言多线程运行后为什么值会变成这样 请问为什么运行下列程序后,gCount的值不为5,而是为一个莫名其妙的随机数啊? 如果说是多线程影响的,那毕竟加和减在两个函数里都限定死了为10000000次,那运算结果应该还是为5啊? 整个运行机制到底是怎样的? 求大神解答! #include #include #include volatile unsigned int gCount=5; //gCount是全局共享变量,volatile表明不进行优化 unsigned __stdcall F

C语言数据结构:表达式求值代码问题

问题描述 C语言数据结构:表达式求值代码问题 要求允许小数,过滤空格,可以+ - * /和求指数 #include #include #include #include #define true 1 #define false 0 #define OPSETSIZE 8 //运算符集合数为8 char OPSET[OPSETSIZE] = { '+', '-', '*', '/', '(', ')', '#', '^' }; unsigned char Prior[8][8] = { /****

希望大神帮助下-关于C语言中数组的输出,求…………

问题描述 关于C语言中数组的输出,求---- #include int main() {int i,a[10]; for(i=1;i<=10;i++) a[i]=i; printf("%d ",a); return 0; } 怎么才可以输出这样形式呢? 12345678910 为什么老是输出 1244960 这种形式呢?谢谢! } 解决方案 printf("%d ",a[i]); C语言中的数组输出不能整体输出,的用for循环依次输出每一个元素 数组名就像一个

c语言-C语言的基础问题输出最小值时一直是A

问题描述 C语言的基础问题输出最小值时一直是A #include int main() { int a=0, b=0,c=0,t=0; scanf_s("%d,%d,%d",&a,&b,&c); t = a; if (t < b) t = b; if (t < c) t = c; printf("最大值为:%dn",t); getchar(); } 解决方案 scanf_s("%d,%d,%d",&a,