4.10编程笔记

这篇博客探讨了C/C++编程中的一些常见疑惑,包括*(a+i)与a[i]的关系,二维数组指针的概念,以及自增运算符a[i++]和a[++i]的异同。通过实例解析了main函数参数的意义,以及fread()和fwrite()在二进制文件处理中的应用。

    最近在学文件,编一个商品记录的代码,两百多行,尽管过程非常艰辛,但是同时也收获了很多~~~

   

   

int main(int argc, char*argv[])是什么意思?什么时候用?请举个例子,谢谢

这是C/C++的一重要函数,叫主函数。无论程序多复杂,代码中必须有这么一个函数,也只能有一个这样的函数;程序执行时就是从这个函数进入的。由于问得比较笼统,如果你想知道详细情况的话,发给你一个网友的求助与本人的回答,自己看吧……

假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在此可执行文件所在目录的提示符下键入:   PROG ABCDEFGH  IJKL<回车>则输出结果为:
main(int argc,char *argv[])
{while(--argc>0)
printf("%s",argv[argc]);
printf("\n");}
各句程序什么意思?
输出结果是什么?
请帮忙解决,谢谢

回答求助:
   这段代码不长,但要说清楚你的要求还需要比较长的一段话。首先,说一下main(int argc, char *argv[])函数的两个形参,第一个intargc,是记录你输入在命令行(你题目中说的操作就是命令行输入)上的字符串个数;第二个*argv[]是个指针数组,存放输入在命令行上的命令(字符串)。当命令行输入PROG ABCDEFGH  IJKL时,记录了3个字符串(以间隔为界,不含间隔,这是约定),*argv[0]中放的是"PROG",*argv[1]中放的是"ABCDEFGH",*argv[2]中放的是"IJKL",这样argc就是3了。while(--argc>0)是条件循环,argc>0时继续;argc初值是3,前置--先减1为2,所以后面的输出语句打出*argv[2]中的内容IJKL;再执行while(--argc>0),argc再减1为1,打出*argv[1]中的内容ABCDEFGH;再循环,argc减1为0,条件破坏,不再执行while(--argc>0)的循环体。所以最后显示的是IJKLABCDEFGH。不知给你说清楚了没有?希望有帮助。


1)有下列程序:
main(int argc, char   *argv[ ])
{ int n=0, i;
for (i=l; i<argc; i+ +) 

 n=n*10+*argv[i] –'0';
printf("%d\n", n);
}
编译连接后生成可执行文件 tt.exe。若运行时输入以下命令行
tt  12 345  678
输出结果是()
那个语句里面N*10是什么意思。

 

是这样的,argc接受输入命令中的单词数(空格隔开的那些),argv这个二维数组接收这些“单词”,因此此例中argc是4,argv[0]到argv[3]存放的依次是tt、12、345和678
再 看n=n*10+*argv[i]-‘0’中,*argv[i]相当于argv[i][0],也就是每个“单词”的第一个字母,而这个表达式就是将*argv[i]中的数字字符转化成数字再组合成数字,因此这个数字就是除了第1个单词(for是从i=1开始的)的第一个数字组成的数字:136
另外,n=n*10+*argv[i] – '0'是一种计算方法,作用是根据给出的单个数字依次组成一个数字,例如我给出单个数字1,2,3,那么第一次n=0*10+1=1,第二次n=1*10+2=12,第三次n=12*10+3=123,可以组成数字123
希望对你有帮助

 

memset函数详解:http://blog.sina.com.cn/s/blog_715d0ae30100yj2d.html
关于rewind函数:
http://www.cnblogs.com/macong/archive/2012/11/13/2768739.html
 

fread()fwrite()函数,用于二进制文件的处理

(因为二进制文件存储记录时每一个记录是等长的)

1.fread用法:

int fread(void *bufferint sizeint countFILE * stream)

stream所指向的流中读取数据到buffer所指向的数组中, size表示单个数组元素的大小,最多读取count个数组元素,流的文件位置指针根据成功写入的字节数递增。函数返回成功读入的元素个数。如果发生读错误,则返回值可能小于count

2.fwrite用法:

int fwrite(void *bufferint sizeint countFILE * stream)

fwrite()──buffer所指向的数组的内容写入stream所指向的流中。size表示单个数组元素的大小, 最多写入count 个数组元素。流的文件位置指针根据成功写入的字节数递增。函数返回成功写入的元素个数,如果遇到写错误,返回值可能小于count

 

fread和fwrite的函数原型分别为:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);fread和fwrite函数参数的含义:
参数size指出一条记录的长度;
参数nmemb指出要读或写多少条记录,这些记录在ptr所指的内存空间中连续存放,共占size * nmemb个字节;
ptr是指向的某连续内存空间的指针;

stream是文件指针;

fread从文件stream中读出size * nmemb个字节保存到ptr中所指的内存空间中;
fwrite把ptr中的size * nmemb个字节写到文件stream中。

 

#include<stdlib.h> 
#include<stdio.h> 

int main() 
{ 
int a = 9;
int b;
FILE *f;

f = fopen ("C:\\date","wb+");
fwrite (a, sizeof(int), 1,f);
fread  (b, sizeof(int), 1,f);

printf ("%d",b);
getch();

fclose(f);

return 0;
}
b为何得到不以a的值?fread与fwrite的用法到底是怎样的呀?求助。。。

 
 
回答:
你可以想像有一只“笔”在执行文件操作。 

f = fopen ("C:\\date","wb+"); 
用读写方式打开了文件。这时“笔”是在文件开头位置。 

fwrite (a, sizeof(int), 1,f); 
写进一个INT整数后,“笔”的位置移到了INT整数的后边。 

fread (b, sizeof(int), 1,f); 
这时去读“笔”位置开始的一个整数,是读不到a的。它读的是a后边的那个整数。 

建议,在 fwrite 和 fread 之间加进函数, 

fseek( f, 0, SEEK_SET ); 
这个函数是将“笔”移动到文件的开始位置。 

然后再 fread 试一试。 

补充一下:你的 fread 函数调用方法写错了,应该用 b 的指针调用
fread( &b, sizeof(int), 1, f ); 

如果有不明白的欢迎留言。

 

 

 
 
%-10d:表示的是你整个输出的数共10位,比如说你输出的是12345 这个数只有5位数 要求是输出10位数 就得是左对齐右端补空格 输出就为12345_ _ _ _ _, %10d:就是右对齐左端补空格_ _ _ _ _12345

%6.2f的格式含义是,数字整体长度包括小数点为6位,保留两位小数。但当实际长度大于格式定义的位数时以实际为准

若不足则在前面补空格(右对齐),若要左对齐,则%-6.2f

 

%f和%lf

printf中,%f通杀单精度和双精度
在scanf中,%f和%lf才有区别

1.    float为单精度实数,double为双精度实数 精度(有效数字)主要看尾数位
2.在一般计算机中,为float类型的变量分配4个字节的存储单元,为double类型变量分配8个字节的存储单元
3.float数值范围约在 -10e38~10e38,并提供7位有效数字位,绝对值小于10e38的数被处理成零值
4.double数值范围约在-10e308~10e308,并提供15~16位有效数字,绝对值小于10e308的数被处理成零值
整型数据与字符型数据之间的转换
(利用ASCII码)
字符转整型:-‘0’    整型转字符:+‘0’
int i;
char c='1';
i=c-'0';//或者是 i=c-48;
此时i就等于1.

*(a+i)与a[i]是一样的地址,为什么?

二维数组指针中说*(a+i)表示数组a的第i行第0列元素的地址,可是按照指针概念里说的符号*是取内容运算符,那*(a+i)应该就是取地址i 行0列元素的值,怎么会是地址,这个不懂,希望帮忙,谢谢!!!

不是的,给*p赋值,并不是直接赋给它数值,而是赋给他一个地址,比如说:*p=&i,那么就给*p赋给了i的内存地址,系统在读取到内存地址之后再读出该内存所存的数值,而*p的内存地址等于i的内存地址,所以*p的数值与i的数值是一样的,虽然 在赋值语句之后,*p等价于i, 但是不能说直接把数值赋了*p。*p=&i的含义是变量i的地址作为一个数据存放在指针变量p所对应的内存单元中。

二维数组中,a+i表示第i行的地址,那为什么*(a+i)也表示第i行的地址。

 

 

a[i++]和a[++i]的区别:

相同点:i都加1,都使i的值变成下一个元素的序号。
异同点:a[i++]中i++是后自增,必须先使用当前元素的值再使用下一个元素的值,a[++i]中++i是前自增,可以直接使用下一个元素的值。
例子:
# include <stdio.h>
int main ()
{
int a[3] = {1,2,3};
int i = 0;
printf("%d\n",a[i++]);//
本输出的值为1,因为是i++,所以是先使用a[0]的值,再加上1,即先输出a[0]的值。
i = 0;
printf("%d\n",a[++i]);//本输出的值为2,因为++i,所以直接使i加1,即输出a[1]的值。
return 0;
}

关于对数组元素a[i][j]的引用:*(*(a+i)+j)为什么也正确呢,*(a+i)等价于a[i]么?
我怎么感觉应该是a+i与a[i]等价呢?
 
首先a是二维数组的首地址,也是二维数组第一行的首地址,是个常量指针,
a[i]也是地址,表示第 i 行的地址,
a+i表示相对于地址a偏移 i 个单位的地址,与a[i]等同,
*(a + i)表示对 相对于地址a偏移 i 个单位的地址 取内容,即表示对a[i] 的地址 再取内容,因为a[i] 与&a[i]等同,所以取出的为a[i]的地址,也与a[i]等同,为同一地址.
而*(*(a+i)+j)表示二维数组第 i 行第 j 列的元素,与a[i][j]等同.
 

while(1) 什么意思 while(i--)什么意思?

while语句的原型是while(表达式)语句,当表达式为非0值时,执行while语句中的嵌套语句。

那么while(1)其中1代表一个常量表达式,他永远不会等于0。所以,循环会一直执行下去。除非你设置break等类似的跳出循环语句循环才会中止

while(i--)其中i是一个变量,因此表达式i--有不同的值,依次递减,i--是先取值后减,--i先加后取值,所以i--的值同未执行该自减运算时的i相等。因此当i为0时,循环会跳出

很容易混淆的是把i--的值误认为i执行自减后的值,可以编个小程序验证下


#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
    int i=1;
    while(i--)//此时i=0
    {
              i--;//执行该语句i为-1
              break;
           
    }
    cout<<i;
    system("pause");         
}
输出为-1,说明执行了循环内i--的语句
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值