C语言基础知识

目录

一.主函数

二.变量

三.关键字 

static 

struct 

四.数据类型 

整型数据

基本整形:

整形的进制:

字符型数据

浮点型数据

布尔类型

五.操作符

算数操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

下标引用,函数调用和结构成员

六.数组

一维数组的定义

一维数组的初始化

一级数组传参  

二维数组的定义

二维数组的初始化

二级数组传参 

 七.指针

一级指针

定义指针变量

引用指针变量

通过指针引用数组

引用数组元素时指针的运算

总结

野指针

概念

如何规避野指针

二级指针

指针数组

数组指针 



一.主函数

int main()
{
    return 0;
}

二.变量

变量名:在C语言中属于标识符,命名有以下严格的规范 

  1. 只能有字母(包括大,小写),数字,下划线(_)组成
  2. 不能以数字开头
  3. 长度不能超过63个字符

三.关键字 

注:不能做变量名!

autobreakcasecharconstcontinuedefaultdodouble
enumexternfloatforgotoregisterinlineintlong
returnrestrictshortsignedsizeofstaticstructvoidswitch
typeofunionunsignedvolatileelsewhileif

static 

static用来修饰变量和函数的:

  1. 修饰局部变量:改变了变量的生命周期,到程序结束,生命周期结束
  2. 修饰全局变量:使全局变量只能在本文件中使用
  3. 修饰函数:使函数只能在本源文件中使用

struct 

结构体的声明: 

struct tag
{
    member-list;
}variable-list;

结构体成员的访问:

  1. 结构体变量.成员变量名
  2.  结构体指针->成员变量名

四.数据类型 

整型数据

基本整形:

类型字节(8bit)取值范围
int4

-2^31 ~ 2^31-1

unsigned int40 ~ 2^31-1

总结:(n位)有符号数:-2^n-1 ~ 2^(n-1)-1   无符号数:0 ~ 2^n-1

整形的进制:

八进制:以0为前缀(012 = 十进制的10)

十六进制:以0x为前缀(0x1A2B = 十进制的6699)

在printf()的进制占位符如下:

  • %d:十进制整数
  • %o:八进制整数
  • %x:十六进制整数
  • %#0:显示前缀为0的八进制整数
  • %#X:显示前缀为0X的十六进制整数

字符型数据

字符‘1’:占一个字节,(ASCII码为49:00110001)

整数1:占4个或者8个字节(00000000 00000000 00000000 00000001)

浮点型数据

m*b^e的形式:m为小数部分,b是基数(通常为2),e是指数部分

布尔类型

#include<stdbool.h>
bool flag=false;

五.操作符

算数操作符

+      -       *      /     %

移位操作符

<< 左移操作符

>>右移操作符

注:移位操作符的操作数只能是整数

左移操作符:

                        左边抛弃,右边补0

右移操作符: 

        1.逻辑移位:左边用0填充,右边丢弃

        2.算术移位:左边用原该值的符号位填充,右边丢弃                 

位操作符

&  按位与

|   按位或

^  按位异或

赋值操作符

+=        -=        *=        /=        %=        >>=        <<=        &=        |=        ^=

单目操作符

!                逻辑反操作

-                负值

+               正值

&              取地址

sizeof       操作数的类型长度(以字节为单位)

~              对一个数的二进制按位取反

--              前置,后置--

++            前置,后置++

*              间接访问操作符(解引用操作符)

(类型)      强制类型转换

关系操作符

>        >=        <        <=        !=        ==

逻辑操作符

&&        逻辑与

||          逻辑或

条件操作符

exp1?exp2 :exp3

逗号表达式

exp1,exp2,exp3,...expN

逗号表达式,从左往右依次进行,整个表达式的结果是最后一个表达式的结果。 

下标引用,函数调用和结构成员

        1.[ ] 下标引用操作符

                操作数:一个数组名+一个索引值

        2.( ) 函数调用操作符

                接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数

        3.访问一个结构的成员

.        结构体.成员名

->     结构体指针->成员名

六.数组

一维数组的定义

类型符  数组名[常量表达式];

一维数组的初始化

  1. 在定义数组时对全部数组元素赋予初值。如  int a[3]={1,2,3};
  2. 可以只给一部分元素赋值。如  int a[10]={1,2,3};
  3. 如果想使一个数组元素全部为0。如  int a[10]={0};
  4. 在对全部数组元素赋值的时候,由于数据的个数已经确定,因此可以不指定数组长度。如  int [4]={1,2,3,4};=  int a[]={1,2,3,4};

一级数组传参  

#include<stdio.h>
void test1()  //可以写:int arr[ ] 或  int arr[10]  或  int *arr
    {
        }
void test2() //可以写:int *arr[20] 或  int **arr
    {
        }
int main()
{
  int arr[10]={0};
  int *arr2[10]={0};
  test(arr);
  test2(arr2);
  return 0;
}

二维数组的定义

类型符  数组名[常量表达式][常量表达式];

二维数组的初始化

  1. 分行给二维数组赋初值。如int a[2][3]={{1,2,3},{4,5,6}};
  2. 可以将所有数据放到一个花括号内,按数组元素在内存中的排序顺序对各个元素赋初值。如  int a[2][3]={1,2,3,4,5,6};
  3. 可以对部分元素赋初值。如  int a[2][3]={{1},{5}}; 
  4. 如果对全部元素都赋初值,则第一维的长度可以不指定,但第二维的长度不能省。如   int a [2][3]={1,2,3,4,5,6};  =   int a [  ][3]={1,2,3,4,5,6};  =   int a [][3]={{1,2,3},{}};

        注:一个{ }是行,{ }里面是列。

数组名是什么?

        数组名是数组首元素的地址

但有两个例外:

①.sizeof (数组名):表示整个数组,计算整个数组的大小

②.&数组名:表示整个数组,取出的是整个数组的地址

二级数组传参 

#include<stdio.h>
void test1()  //可以写:int arr[3][5] 或 int arr[ ][5]  或  int (*arr) [5]
    {
        }

int main()
{
  int arr[3][5]={0};
  test(arr);
  return 0;
}

注: int  (*arr) [5] 是数组指针,可以指向一个有5个整形元素的数组

 七.指针

一个变量的地址称为该变量的“指针”

指针变量就是地址变量,用来存放地址,其值是地址

一级指针

定义指针变量

类型名 *指针变量名;

注:(1)指针变量前的“*”表示该变量类型为指针型变量

       (2) 在定义指针变量时必须指定其类型

       (3)指针变量中只能存放地址(指针)

引用指针变量

  • 给指针变量。如:p=&a;//指针变量p的值就是变量a的地址
  • 引用指针变量指向的变量。如:printg("&d",*p);//以整数的形式输出a的值
  • 引用指针变量的值。如:printf("%o",p)://以八进制形式输出变量p的值

通过指针引用数组

所谓数组元素的指针就是数组元素的地址

p = &a[0];  
//p=a

int *p = &a[0];  
//int *p=a
//int *p; p=&a[0];
//int *p; p=a;

引用数组元素时指针的运算

  1. 如果指针变量p已经指向数组的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
  2. 如果p的初值为&a[0],则 p+i 和 a+i 就是数组元素 a[i] 的地址。
  3. *(p+i)=*(a+i)= a[ i ] 。
  4. 如果指针变量p1和p2都指向同一数组,则p2-p1的值(两个地址之差)/(数组元素长度)=指针之间的元素个数。

总结

  • 指针变量:用来存放地址的变量
  • 指针是用来存放地址的,地址是唯一标识一块地址空间的
  • 指针大小在32位平台上是4个字节,在64位平台上是8个字节
  • 指针类型的意义:①指针解引用的权限有多大  ②指针走一步能走多远

野指针

概念

                就是指针指向的位置是不可知的

如何规避野指针

  1. 指针初始化
  2. 小心指针越界
  3. 指针指向空间释放及时置NULL
  4. 避免返回局部变量的地址
  5. 指针使用前检查有效性

二级指针

int a =10;
int *pa = &a;  //一级指针
in* *ppa = &pa; //二级指针

注:*ppa=pa  (int* 是指pa的类型)// **ppa=*pa=a

指针数组

 int* arr[10];         //整形指针的数组

 char* arr[4];        //一级字符指针的数组

数组指针 

int(*p) [10];

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值