C语言 笔记1

关键字

  • 关键字就是C语言提供的有特殊含义的符号,有些地方也叫做“保留字”
  • 全都是小写,在开发工具中会有特殊的颜色。
  • C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义。
auto double int struct break else long switch

case enum register typedef char extern return union

const float short unsigned continue for signed void

default goto sizeof volatile do if while static

标识符

  • 标识符就是在程序中自定义的一些符号和名称。要跟关键字区分开来:关键字是C语言默认提供的符号,标识符是程序员自定义的。
  • 函数名是标识符、变量名是标识符……
  • 标识符命名规则
    1> 只能由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_组成。
    2> 严格区分大小写,同一段英文字母的大写和小写是两个不同的标识符。
    3> 不能以数字开头。
    4> 不可以使用关键字作为标识符。

标识符命名规范

  • 1> 尽量起个有意义的名称,比如一个完整的英文单词,别人一看这个名称就能才能这个标识符的作用。如果不懂英文,你也可以用拼音,尽量不要起像abcde、sfsdfsdf等这类看起来没有意义的名称
  • 2> 如果标识符中含有多个单词,可以使用驼峰标识(除开第一个单词,后面每个单词的首字母都是大写):firstName、myFirstName,或者使用下划线_来连接:first_name、my_first_name

静态数据

  • 概念:静态数据是指一些永久性的数据,一般存储在硬盘中。
  • 存储的时长:计算机关闭之后再开启,这些数据依旧还在,只要你不主动删掉或者硬盘没坏,这些数据永远都在。
  • 哪些是静态数据:静态数据一般是以文件的形式存储在硬盘上,比如文档、照片、视频等

动态数据

  • 概念:动态数据指在程序运行过程中,动态产生的临时数据,一般存储在内存中。
  • 存储的时长:计算机关闭之后,这些临时数据就会被清除。
  • 哪些是动态数据:当运行某个程序(软件)时,整个程序就会被加载到内存中,在程序运行过程中,会产生各种各样的临时数据,这些临时数据都是存储在内存中的。当程序停止运行或者计算机被强制关闭时,这个程序产生的所有临时数据都会被清除。
    你可能会问:既然硬盘的存储空间这么大,为何不把所有的应用程序加载到硬盘中去执行呢?有个主要原因是内存的访问速度比硬盘快N倍。

常量

  • “量”表示数据。常量,则表示一些固定的数据,也就是不能改变的数据。
  • int、float、double、char、字符串
  • 注意:单引号只能括住1个字符,而且不能是中文字符,下面的写法是错误的:’abc’、’123456’、’男’

变量

  • 常量表示的数据是不可以改的,而用变量表示的数据是可以经常修改的。
  • const关键字:默认情况下,变量的值是可以不断改变的。不过,有时候我们会希望变量的值只在定义的时候初始化一次,以后都不能再改变,这个时候我们就可以使用const关键字来修饰变量。

各种数据类型的取值范围

这里写图片描述

说明符

  • C语言提供了以下4种说明符,4个都属于关键字:
    short 短型
    long 长型
    signed 有符号型
    unsigned 无符号型
    按照用途进行分类,short和long是一类,signed和unsigned是一类。

  • short和long可以提供不同长度的整型数,也就是可以改变整型数的取值范围。在64bit编译器环境下,int占用4个字节(32bit),取值范围是-231~231-1;short占用2个字节(16bit),取值范围是-215~215-1;long占用8个字节(64bit),取值范围是-263~263-1

  • 可以连续使用2个long,也就是long long。一般来说,long long的范围是不小于long的,比如在32bit编译器环境下,long long占用8个字节,long占用4个字节。不过在64bit编译器环境下,long long跟long是一样的,都占用8个字节。

  • 还有一点要明确的是:short int等价于short,long int等价于long,long long int等价于long long

  • long的使用注意:long和int都能够存储整型常量,为了区分long和int,一般会在整型常量后面加个小写字母l,比如100l,表示long类型的常量。如果是long long类型呢,就加2个l,比如100ll。如果什么都不加,就是int类型的常量。因此,100是int类型的常量,100l是long类型的常量,100ll是long long类型的常量。

  • long的输出:应该用格式符%ld。long long的输出:应该用%lld

  • signed和unsigned
    1> 首先要明确的:signed int等价于signed,unsigned int等价于unsigned
    2> signed和unsigned的区别就是它们的最高位是否要当做符号位,
    signed:表示有符号,也就是说最高位要当做符号位,所以包括正数、负数和0。其实int的最高位本来就是符号位,已经包括了正负数和0了,因此signed和int是一样的,signed等价于signed int,也等价于int。signed的取值范围是-2^31 ~ 2^31 - 1
    unsigned:表示无符号,也就是说最高位并不当做符号位,所以不包括负数。在64bit编译器环境下面,int占用4个字节(32bit),因此unsigned的取值范围是:0 ~ 2^32 - 1
    3>signed、unsigned也可以修饰char,long还可以修饰double

复合赋值运算符

+= 加赋值运算符。如a += 3+2,等价于 a = a +(3+2)
-= 减赋值运算符。如a -= 3+2,等价于 a = a -(3+2)
= 乘赋值运算符。如a = 3+2,等价于 a = a *(3+2)
/= 除赋值运算符。如a /= 3+2,等价于 a = a /(3+2)
%= 取余赋值运算符。如a %= 3+2,等价于 a = a %(3+2)

sizeof

  • sizeof可以用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。
int size = sizeof(10);
printf("10所占的字节数:%d", size);
  • sizeof一共有3种形式
    1、sizeof( 变量\常量 )
    2、sizeof 变量\常量
    3、sizeof( 数据类型 )

逗号运算符

int a = 2;
int b = 0;
int c;

c = (++a, a *= 2, b = a * 5);

printf("c = %d", c);

表达式1, 表达式2, … …, 表达式n
逗号表达式的运算过程是:从左到右的顺序,先计算表达式1,接着计算表达式2,…,最后计算表达式n
逗号运算符也是一种运算符,因此它也有运算结果。整个逗号表达式的值是最后一个表达式的值

关系运算符

C语言规定,任何非0值都为“真”,只有0才为“假”。也就是说,108、-18、4.5、-10.5等都是“真”,0则是“假”。

关系运算符的使用注意:
  • 1> 关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者。
    例如2==3>1 :先算3>1,条件成立,结果为1。再计算2==1,条件不成立,结果为0。因此2==3>1的结果为0。
  • 2> 关系运算符的结合方向为“从左往右”
    例如4>3>2 :先算4>3,条件成立,结果为1。再与2比较,即1>2,条件不成立,结果为0。因此4>3>2的结果为0。
  • 3> 关系运算符的优先级小于算术运算符
    例如3+4>8-2 :先计算3+4,结果为7。再计算8-2,结果为6。最后计算7>6,条件成立,结果为1。因此3+4>8-2的结果为1。

三目运算符

  • 使用格式
    表达式A ? 表达式B : 表达式C
  • 运算结果
    如果表达式A成立,也就是为“真”,条件运算符的结果就是表达式B的值,否则,就为表达式C的值

位运算符

    1. & 按位与
    1. | 按位或
    1. ^ 按位异或
    1. ~ 取反
    1. << 左移
      -功能:把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方。
    1. >> 右移
      功能:把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方。

#include <>和#include “”的区别

二者的区别在于:当被include的文件路径不是绝对路径的时候,有不同的搜索顺序。

1> 对于使用双引号”“来include文件,搜索的时候按以下顺序:

先在这条include指令的父文件所在文件夹内搜索,所谓的父文件,就是这条include指令所在的文件
如果上一步找不到,则在父文件的父文件所在文件夹内搜索;
如果上一步找不到,则在编译器设置的include路径内搜索;
如果上一步找不到,则在系统的INCLUDE环境变量内搜索

2> 对于使用尖括号<>来include文件,搜索的时候按以下顺序:

在编译器设置的include路径内搜索;
如果上一步找不到,则在系统的INCLUDE环境变量内搜索
我这里使用的是clang编译器,clang设置include路径是(4.2是编译器版本):/usr/lib/clang/4.2/include

Mac系统的include路径有:

/usr/include
/usr/local/include

指针与数组的总结

p是指针,a是一个数组

1> 如果p指向了一个数组元素,则p+1表示指向数组该元素的下一个元素。比如,假设p = &a[0],则p+1表示a[1]的地址

2> 对于不同类型的数组元素,p值的改变是不同的。如果数组元素为int类型,p+1代表着p的值加上2(16位编译器环境下)

3> 如果p的初值是&a[0],那么

p+i和a+i都可以表示元素a[i]的地址,它们都指向数组的第i个元素。a代表数组首地址,a+i也是地址,它的计算方法与p+i相同
(p+i)和(a+i)都表示数组元素a[i]
虽然p+i和a+i都指向数组的第i个元素,但二者使用时还是有区别的。因为作为指针变量的p可以改变自身值,如p++,使p的值自增。而数组名a是一个代表数组首地址的常量,它的值是不能改变的,即a++是不合法的
4> 引用一个数组元素可以有两种方法:

下标法: 如a[i]
指针法: 如(p+i) 或 (a+i)

指针:

1、指针的使用注意:

int *p; *p = 10;//是错误的,应该在指针变量指向一个确定的变量后再进行赋值

2、函数返回两个值需要用到指针
 #include<stdio.h>
 int sumAndMinus (int n1,int n2,int *minus)
{
    *minus = n1 - n2;
    return n1 + n2;
}

int main()
{
    int minus;
    int sum;
    sum = sumAndMinus(10,9,&minus);
    printf("minus=%d,sum=%d\n",minus,sum);
}
3、遍历数组
 (1)、下表法
 (2)、指针法
#include<stdio.h>
int main()
{
    int a[4] = {5,1,2,3};
    int *p = a;
    int i;
    for(i = 0;i < 4;i++){
        printf("%d\n",*p++);
    }
}
4、int *p = &a[0]; p+1表示a[1]的地址
5、指针遍历字符串所有的字符
#include<stdio.h>
int main()
{
    char str[] = "chenfanfang";
    char *p = str;//或者char *p = &str[0];
    for(;*p != '\0';p++){
        printf("%c\n",*p);
    }
}
6、字符串函数

strlen、strcpy,strucat,strcmp

strcmp返回的值是前一个字符串减后一个字符串的值

7、返回类型为指针的函数
#include<stdio.h>
char *fun1(){
    char *str ="chenfanfang";
    return str;
}
int main()
{
    char *str = fun1();
    puts(str);
}
8、指向函数的指针
#include<stdio.h>
int sum (int a,int b){
    return a + b;
}

int main()
{
    //定义一个指针变量p,指向sum函数
    int (*p) (int a,int b) = sum;
    //或者 int (*p) (int,int) =sum;
    //或者 int (*p) () = sum;

    //利用指针变量调用函数
    int result = (*p)(1,3);
    //或者int result = p(1,3);
    printf("%d\n",result);
}
9、将函数作为参数在函数间传递
 #include<stdio.h>
//加
int sum (int a,int b){
    return a + b;
}
//减
int minus(int a,int b){
    return a - b;
}
//这个counting函数是用来做a和b之间的计算,至于做加法还是减法运算,由函数的第一个参数决定
void counting(int (*p)(int,int) ,int a,int b){
    int result = p(a,b);
    printf("%d\n",result);
}


int main()
{
    //进行加法运算
    counting(sum,6,4);
    //进行减法运算
    counting(minus,6,4);
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值