c语言笔记-2

来源:互联网 发布:网络贷款无力偿还 编辑:程序博客网 时间:2024/05/21 18:47

定义一个指向函数的指针

#include <stdio.h>int max(int x, int y){    return x > y ? x : y;}int main(void){    /* p 是函数指针 */    int (* p)(int, int) = & max; // &可以省略    int a, b, c, d;    printf("请输入三个数字:");    scanf("%d %d %d", & a, & b, & c);    /* 与直接调用函数等价,d = max(max(a, b), c) */    d = p(p(a, b), c);     printf("最大的数字是: %d\n", d);    return 0;}

结构体

#include <stdio.h>int main(void){   //定义结构体相当于类模板    struct Books{       char  title[50];       char  author[50];       char  subject[100];       int   book_id;    };     //创建结构体变量 相当于创建对象实例    struct Books book1;     struct Books book2;     //strcpy c语言的标准库函数,将后面的字符串复制到book1.title中     strcpy( book1.title, "C Programming");    strcpy( book1.author, "Nuha Ali");     strcpy( book1.subject, "C Programming Tutorial");    book1.book_id = 1000;    strcpy( book2.title, "Telecom Billing");    strcpy( book2.author, "Zara Ali");    strcpy( book2.subject, "Telecom Billing Tutorial");    book2.book_id = 2000;    printf("%s %s",book1.title,book2.title);    return 0;}

dev c++自定义头文件
头文件格式
文件名:mymath.h,与下面ifndef等对应

//这样写是为了防止多次引入 #ifndef _mymath_H#define _mymath_H/////////////代码段//////////////int test;void myfun(){    printf("xxxxxxlkajsdflajsdflkjalksdfjlakkkkkkkk\n\n");}/////////////代码段//////////////#endif

这里写图片描述
这里写图片描述
便可以下main.h中是用了

#include <stdio.h>//引入自定义的文件#include "mymath.h"int main(void){    //使用自定义头文件中的变量和方法    test = 100;    printf("xxxx%d\n",test);    myfun();

命令行参数

int main( int argc, char *argv[]){    //开始程序是传入的参数     if(argc == 2){        printf("第一个参数%s\n",argv[1]);    }else if(argc > 2){        printf("第一个参数%s\n",argv[1]);        printf("第二个参数%s\n",argv[2]);    }else{        printf("传入的s参数不是2个\n");    }

在生成exe文件处打开cmd(shift键+鼠标右键)
这里写图片描述
点击“在此处打开命令创(W)”,
这里写图片描述
第一个参数都是程序名称hello.exe,第二个参数开始才是传入程序的参数

函数传入参数个数可变,以后还需要加强

//文件代码

#include <stdio.h>#include <stdarg.h>#include <stdlib.h>#include "mymath.h"#include <errno.h>//http://blog.csdn.net/gongda2014306/article/details/50769729//http://download.csdn.net/download/henryying/962990 int main( int argc, char *argv[]){    //开始程序是传入的参数     if(argc == 2){        printf("第一个参数%s\n",argv[1]);    }else if(argc > 2){        printf("第一个参数%s\n",argv[1]);        printf("第二个参数%s\n",argv[2]);    }else{        printf("传入的s参数不是2个\n");    }    test = 100;    printf("xxxx%d\n",test);    myfun();   //定义结构体相当于类模板    struct Books{       char  title[50];       char  author[50];       char  subject[100];       int   book_id;    };     //创建结构体变量 相当于创建对象实例    struct Books book1;     struct Books book2;     //strcpy c语言的标准库函数,将后面的字符串复制到book1.title中     strcpy( book1.title, "C Programming");    strcpy( book1.author, "Nuha Ali");     strcpy( book1.subject, "C Programming Tutorial");    book1.book_id = 1000;    strcpy( book2.title, "Telecom Billing");    strcpy( book2.author, "Zara Ali");    strcpy( book2.subject, "Telecom Billing Tutorial");    book2.book_id = 2000;    printf("%s %s\n\n",book1.title,book2.title);    //共用体:这是一个特殊的数据结构,在结构体中可以包含多种类型的数据结构,如下    union Data    {       int i;       float f;       char  str[20];    };     //其实就是一个变量名Data指向一块连续的地址,地址的长度为结构体中变量占最大的长度,每赋值一次,都是将前面的值覆盖,    union Data data;    data.i = 10;    data.f = 100.23;    strcpy(data.str,"aaaaaa");    printf("data的内存大小%d个字节,一个英文字母一个字节\n",sizeof(data));    printf("i的值为10,可以看到i的值损坏了%d\n",data.i);    printf("f的值为100.23,可以看到i的值损坏了%f\n",data.f);    printf("最后一次赋值给data才是有效的:%s",data.str);    /*    实际效果以后再了解,大致的了解一下便可以了     */     printf("我们可以有程序知道当前int占用了%d个字节长度\n",sizeof(int));    //为了节省空间 ,比喻我们只需要存储0或1,由此可知我们只需要一个二进制存放长度的内存     //1. 一个位域必须存储在同一个字节中,不能跨两个字节,故位域的长度不能大于一个字节的长度。    //如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始 //  struct test{//      unsigned int a:1;//占一个二进制位 //      unsigned int b:5;//占5个二进制位 //  };     //C 语言把所有的设备都当作文件。     //菜鸟教程中的c语言的输入输出可以看一下     //文件的读写    FILE *fp = NULL;    //打开指定的文件 ,允许读写 , 后面的 一个详细的参数,参照http://www.runoob.com/cprogramming/c-file-io.html     fp= fopen("D:/a.txt","w+");    //两种不同的方式写入两行数据     fprintf(fp,"xxxxxxxx\n");    fputs("ssssssss\n",fp);    //关闭文件     fclose(fp);    //读取文件     FILE *fp1 = NULL;    char buff[255] ;    fp1= fopen("D:/a.txt","r");    //读取文件的方式一: //  fscanf(fp1,"%s",buff) ;//  printf("1: %s\n",buff);    //读取文件的方式二:     fgets(buff,255,(FILE*)fp1);    printf("2: %s\n",buff);    fgets(buff,255,(FILE*)fp1);    printf("3: %s\n",buff);    fclose(fp1);    //二进制的方式    FILE *fp2 = NULL;    fp2 = fopen("D:\\test.txt", "r+");  // 确保 test.txt 文件已创建    fprintf(fp2, "This is testing for fprintf...\n");       fseek(fp2, 10, SEEK_SET);    if (fputc(65,fp2) == EOF) {        printf("fputc fail");       }       fclose(fp2);     //退出程序     //exit(-1);    //exit(EXIT_SUCCESS);//这个退出程序需要加头文件#include <stdlib.h>     //错误     //需要引入头文件:#include <errno.h>    FILE * pf3;    int errnum;    pf3 = fopen ("unexist.txt", "rb");    if (pf3 == NULL)    {      errnum = errno;      fprintf(stderr, "错误号: %d\n", errno);      perror("通过 perror 输出错误");      fprintf(stderr, "打开文件错误: %s\n", strerror( errnum ));    }    else    {      fclose (pf3);    }    average(3, 5,10,15);    //printf("Average of 5, 10, 15 = %d\n", average(3, 5,10,15));    return 0;}/**问题:1.如何写返回值,有返回值就报错      2.传递不同类型的参数该如何做 *///定义参数数量可变的函数 void average(int num,...){    va_list valist;    double sum = 0.0;    int i;    /* 为 num 个参数初始化 valist */    va_start(valist, num);    printf("参数的个数num的值: %d\n",num);    //这个取值的过程类似堆栈 //  printf("第0个参数参数的类型为int--%d\n",va_arg(valist,int));//  printf("第1个参数参数的类型为int--%d\n",va_arg(valist,int));//  printf("第2个参数参数的类型为int--%d\n",va_arg(valist,int));    /* 访问所有赋给 valist 的参数 */    for (i = 0; i < num; i++)    {       sum = sum + va_arg(valist,int);    }     double arvgtest= sum/num;    printf("所有传入参数的和sum = : %lf\n",arvgtest);     /* 清理为 valist 保留的内存 */    //va_end(valist);}