1、建议:在形参和实参的章节中,可以说一下引用的概念(或者提一下,在指针后详述),因为初学者很容易犯错的地方有两个,一个是以为函数调用时作为参数的变量可以被“被调用函数”修改,另一个是返回被调用函数中临时变量的地址 2、不知道您的这本书能不能进一步整理一下,把重点内容按照重要性利用不同方式标识一下(例如:加粗、划线),以适合各个阶段的学习者。因为我看这个的感觉是:很多东西都很明确,但是为了不漏掉什么内容,还是得一点儿一点儿细看,感觉比较耗时间。
刚才的关于“man 3 printf”的问题已经解决了,不好意思打搅了老师,是我一时粗心没有完善手册导致的! 谢谢!
1. C语言里没有引用的概念。 2. 没这个必要。
int increment(int x)
{
x = x + 1;
return x;
}
int main(void)
{
int i = 1, j = 2;
increment(i); /* i now becomes 2 */
increment(j); /* j now becomes 3 */
return 0;
}宋老师,首先感谢你的共享,找了好长时间终于找到了最适合我看的一本书,本节的第一道题i和j的值在main中是不会变的,能不能把他们当做常量来看待,常量是不会改变的,希望老师能回答!
回头找常量的定义是什么。常量就是常量,不要乱用定义
请问一下 例1 我编译怎么没有输出啊,我加了个printf(“%d\n”,i); printf(“%d\n”,j); i值为1,j值为2.
徐君 xxjj2003@gmail.com: It should be printed as normal. Could you show us your whole code?
大家好:
关于第二个问题,我使用的是VISUAL STUDIO,就会出现error C3861: “printf”: 找不到标识符抱歉。不负责解答Windows下的编程问题。
第二个问题是因为没有包含头文件的话,将调用系统的printf(即文中说的位于第1个Section的系统命令printf),这个和c的库函数c是不同的,因此出现这个警告
楼上的理解是不对的。再想想。
第一个call by value只是给形参赋值,所以原变量的值是不变的 第二个compile过程中,编译器会将会寻找printf的函数声明和定义,在整个代码中包括包含的头文件中都无法找到,自然会提示printf函数未定义
第一题是关于形参与实参之间的值传递问题,形参不能够返回值给实参。 第二题是编译出错,没有声明printf函数,所以warning
#include"stdio.h"
int increment(int *x)
{
*x = *x + 1;
return *x;
}
int main()
{
int a, b;
int *i, *j;
a = 1;
b = 2;
i = &a;
j = &b;
increment(i); /*i now becomes 2*/
increment(j); /*j now becomes 3*/
printf("i = %d, j = %d\n", *i, *j);
return 0;
}
结果:
i = 2, j = 3
@陈yaocheng yiyu89103@126.com 2010-07-07 17:39:35 #include "stdio.h" #include <stdio.h> 使用双引号和尖括号是一样的吗?有什么区别吗?
本书前半部分都没有用双引号include吧。后面会讲到的。
#include <stdio.h>
void increment(int *x)
{
*x = *x + 1;
}
int main()
{
int i = 1 , j = 2;
increment(&i); /*i now becomes 2*/
increment(&j); /*j now becomes 3*/
printf("i = %d, j = %d\n", i, j);
return 0;
}第二个问题 由于没有包含头文件,所以在执行printf时编译器没有看到声明,因此激发了隐声明的机制,printf函数被声明为 int printf(char *format) 与真正定义的 int printf(const char *format,……) 不一样,所以才会有incompatible的warning
习题:
int increment(int x)
{
x = x + 1;
return x;
}
int main(void)
{
int i = 1, j = 2;
increment(i); /* i now becomes 2 */
increment(j); /* j now becomes 3 */
printf("%d:%d\n", increment(i), increment(j));
return 0;
}
结果:i = 2, j = 3例一 应该是没有return 例2 不太理解,应该是没有相应的表头,不能包含进相应的函数吧…… 请老师解答
老师你好
这题目好像不能达到效果,就是行参不能传递参数给实参。
如果要达到效果的话,有必须用行参,我想了很久,都没有想到办法,望老师赐教。顶 郝凯 haokaii@gmail.com
1 #include <stdio.h>
2
3 int increment(int x)
4 {
5 x = x + 1;
6 return x;
7 }
8
9 int main(void)
10 {
11 int i =1, j = 2;
12 printf("i+1=%d\n",increment(i));
13 printf("j+1=%d\n",increment(j));
14 return 0;
15 }
2. #include <stdio.h> #include <stdlib.h> .. .. ..
1、第一道题,因为C用的是值传递,所以i、j只是把值传给函数,但是与函数内的参数x是两个不同的变量。所以不管x的值怎么变,都不会改变i、j的值。 2、没有调用头文件,说明没有给printf做声明。编译器就会认为printf是隐式声明。 int printf(void),隐式声明应该是这样的。但是实际上我们调用printf的时候给了参数-字符串常量,并且printf会返回这个int的值。所以编译器会报错。
我们在main函数中调用increment增加变量i和j的值,这样能奏效吗?为什么? 肯定不增加,函数内部的局部变量在函数执行完就结束了——生命周期问题。 如果在一个程序中调用了printf函数却不包含头文件。。。。 函数库丢了,没有printf的定义,当然会报错。
实参 形参之间的值传递,如果能知道这2个参数在内存的存贮方式,就明白了。形参是在内存里另外的一个地方,开了一个和实参一样大小的空间,并存储着与实参同样值。所以改变形参的值,不会改变实参的值。要达到这个目的,可以使用指针。 C语言的灵魂就是指针。
#include <stdio.h>
void increment(int x)
{
x = x + 1;
}
int main(void)
{
int i = 1, j = 2;
increment(i);
printf("i=%d\n",i);
increment(j);
printf("j=%d\n",j);
return 0;
}
编译 运行
x=1
y=2#include <stdio.h>
void increment(int x)
{
x = x + 1;
printf("%d\n",x);
}
int main(void)
{
int i = 1, j = 2;
increment(i);
increment(j);
return 0;
}
编译 运行
2
3如何解释:
我传了一个1进去,打印出2
这个2最终是通过:printf("占位符",变量);这样的形式被打印出来的
那么存放2的这个变量(指上面括弧中“变量“两字所指的东西)是哪个变量呢?既然不是i,j,x?
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!