我的C学习笔记[希望大家多多指点]

函数定义可以任何次序出现在一个或多个源文件中,但同一函数不可以分割在多个文件中;

对于主函数main而言,return返回值为0表示正常终止,非0则表示非正常终止【出现异常或出错结束程序】

Void显式说明该函数不返回任何值

从技术角度来看,地址就是指向变量的指针

在c中,人们通常把变量和函数的extern声明放在一个单独的文件中,习惯上称之为头文件【.h】

C中,被调用函数不能直接修改主调函数的值,只能修改其私有临时副本的值;

ASCII码表:字母(包括大写)以及一些常用的符号没法表示,因此约定一套编码来表示这些符号;

计算机在存储数据和执行指令的时候是以8个比特(bit)为单位的,也就是1个字节(byte),

bit(比特),即 存放一个1或者0的空间。

sizeof操作符来计算不同数据类型在内存中所占空间的大小,单位是字节(byte);

不同的数据类型有不同的输出格式

%d - 打印整形

%c - 打印字符

%f - 打印浮点型 - 小数

%p - 以地址形式打印

%x - 打印16进制数字

%s - 打印字符串

全局变量:定义在代码块{}之外的变量;

局部变量:定义在代码块{}之内的变量;

全局变量与局部变量名相同,局部变量优先。

作用域:限定这个名字的可用性的代码范围就是这个名字的作用域;

1、局部变量的作用域是变量所在的局部范围。

2、全局变量的作用域是整个工程。

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段;

1、局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。

2、全局变量的生命周期是:整个程序的生命周期。

常量类型:1.字面常量【程序中出现的数字,字符等,10 和 w 就是字面常量。】

                2.const修饰的常变量【const修饰的常变量无法修改】

          3.#define定义标识符常量【define定义的常量不能被修改,这种定义方式相当于给字面常量起别名,它的别名具有字面常量的属性,在使用时别名直接替换为字面常量

e.g. #define name stuff这里的name在代码中就可以完全替代后面的stuff。***define定义标识符常量如果要换行的话千万不能用空格换行,必须用续航符' \ '来换行,并且注意,不能在续航符后面加空格,在define定义标识符的时候,建议不要加上分号.】

          4.枚举常量【通过枚举关键字enum定义的常量。一般形式为:

enum名{枚举元素1,枚举元素}】

字符串:由双引号引起来的一串字符称为字符串字面值【单个字符只用单引号括起来】,或者简称字符串。注:字符串相当于多个字符连续存放在字符数组中,但是字符串的结尾是一个隐藏的\0 转义字符。在计算字符串长度的时候\0 是结束标志,不算作字符串内容,\0对于字符串非常重要,在打印字符串时,\0可以使打印停止。当字符数组的大小比我们存入数组的字符串大时,多出的空间会全部补为\0。【高中生物编译中终止子】

转义字符

 

常见关键字

  1. typedef 顾名思义是类型定义,这里应该理解为类型重命名。

//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名

typedef unsigned int uint_32;

2. 在C语言中: static是用来修饰变量和函数的;

 

 1、修饰局部变量-静态局部变量;【static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束, 生命周期才结束】

 2、修饰全局变量-静态全局变量;【一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。】

 3、修饰函数-静态函数;【一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。】

***源文件其实就是纯文本文件,它的内部并没有特殊格式,源文件后缀大都根据编程语言本身的名字来命名。

#define 定义常量和宏

#defne 宏名(被替换的内容)(要替换的内容)

Eg.#define ADD(x,y) ((x)+(y))

指针

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节(byte)。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

1.地址的取出

变量都有地址, &操作符可以将变量的地址取出,然后赋值给指针

#include <stdio.h>

int main()

{

    int num = 10;

    &num;//取出num的地址

    //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)

    printf("%p\n", &num);//打印地址,%p是以地址的形式打印

    return 0;

}

  1. 地址的存储

需要定义指针变量【也有地址】

#include <stdio.h>

int main()

{

    int num = 10;

    int* p = &num;

    *p = 20;        //*是解引用操作符,*p是通过p找到p指向的对象,即num

    return 0;

}

总结如下:

我们取出一个变量的地址的时候,这个地址便称为 指针;

 而这个地址如果要存起来的话,需要存到一个变量里面去,这个变量就被称为 指针变量;

指针变量可以对它进行 解引用【解引用是指:通过指针,找到对应的内存和内存中的数据。】 操作;指针是一个变量,用来存放地址;指针大小在32位平台是4个字节,64位平台是8个字节。

//关于*的特别说明

*在C/C++中还有一个名字就是“解引用”,但需要注意的是,在变量声明的时候,*不能当做解引用使用,只是表示你声明的变量是一个指针类型。Eg. *p=5;//这就是解引用,*解释了 p对常量 5的内存地址的引用,解释结果就是直接去寻找p所指内容,因为p指向a,所以a的内容将被修改为5,而不是50。

//关于&的特别说明

& 在C/C++中具体 3种语义, 按位与,取地址 和声明一个引用。

int a=0x0000002 & 0x00000003;//按位与

int *p=&a;//取地址,取出a在内存中的地址给p,这样就建立一个指针映射,使得p指a

int &a=b;//声明a是b的引用,对a操作修改也就是直接对b修改。

在指针操作中,&还有一种叫法叫做“脱去解引用”在这个表达式中&*p(假设p是指针),&脱去了*对p的解引用,从而得到抵消的效果,得到应该是p所指的变量的地址。

结构体

结构体使得C语言有能力描述复杂类型结构体,它就将不同类型的数据存放在一起,作为一个整体进行处理。结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。[在C语言中,结构体不能包含函数。!!!]

//声明一个结构体

struct book

{

char title[MAXTITL];//一个字符串表示的titile 题目 ;

char author[MAXAUTL];//一个字符串表示的author作者 ;

float value;//一个浮点型表示的value价格;

};//注意分号不能少,这也相当于一条语句;

//我们有时候也将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象。

C语言结构体定义的三种方式

  1. 最标准的方式:

#include <stdio.h>

struct student //结构体类型的说明与定义分开。声明

{

int age;  /*年龄*/

float score; /*分数*/

char sex;   /*性别*/

};

int main ()

{

struct student a={ 20,79,'f'}; //定义

printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );

return 0;

2.不环保的方式[最不环保的方式,是可以使用多次的]

#include <stdio.h>

struct student /*声明时直接定义*/

{

int age;  /*年龄*/

float score;  /*分数*/

char sex;   /*性别*/

/*这种方式不环保,只能用一次*/

} a={21,80,'n'};

int main ()

{

printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );

  1. 最奈何人的方式

#include <stdio.h>

struct   //直接定义结构体变量,没有结构体类型名。这种方式最烂

{

int age;

float score;

char sex;

} t={21,79,'f'};

int main ()

{

printf("年龄:%d 分数:%f 性别:%c\n", t.age, t.score, t.sex);

return 0;

}

return 0;

}

}

EXTERN

  • 引用同一个文件中的变量

#include<stdio.h>

int func();

int main()

{

    func(); //1

    extern int num;

    printf("%d",num); //2

    return 0;

}

int num = 3;

int func()

{

    printf("%d\n",num);

}

二、引用另一个文件中的变量[extern这个关键字的真正的作用是引用不在同一个文件中的变量或者函数。extern关键字只需要指明类型和变量名就行了,不能再重新赋值,初始化需要在原文件所在处进行,如果不进行初始化的话,全局变量会被编译器自动初始化为0,只有当一个变量是一个全局变量时,extern变量才会起作用.]

#include<stdio.h>

int main()

{

    extern const int num;

    printf("%d",num);

    return 0;

}

#include<stdio.h>

const int num=5;

void func()

{

    printf("fun in a.c");

}

  1. 引用另一个文件中的函数

#include<stdio.h>

int main()

{

    extern void func();

    func();

    return 0;

}

#include<stdio.h>

const int num=5;

void func()

{

    printf("fun in a.c");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值