c语言笔记

本文详细介绍了C语言的基础知识,包括字节、输入输出、数组、指针、函数、内存管理、结构体、共用体和枚举等内容。强调了指针与数组的关系,以及动态内存分配和结构体在实际应用中的用法。还提到了字符串常量和变量的区别,以及二位数组和指针数组的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.一个字节 8位!!!

1.scanf 输入连续字符的时候scanf(" %d%c",&n,&c),输入 2"空格"a 回车键,c的值为“空格”,输入2“回车”a“回车”,c的值为“回车”。 应该直接输入2a再回车,因为“空格”,“回车”都会被当做字符接收

2.数组可以定义这样:int a[]={1,2,3,4} ----大括号里面的数字根据后面的数据自动分配

数组声明后不初始化,里面值为随机值,部分初始化后,未被初始化部分自动被初始化为0

3.sizeof 是关键字不是函数 计算数组大小:sizeof(arry)/sizeof(arry[0])

4.冒泡排序(4.4),简单选择排序(4.5)

5.二维数组a[][3] (行可以不写)

6.函数中形式参数:只有在调用的时候才会申请空间,在调用结束后内存就会被释放掉
(形参注重类型,必须写类型,名字可以不写 如:void fun(int,int )

7.三目运算符:z=x>y?x:y;

8.形参中不存在数组的概念,即使括号中约定数组大小都是无效的(传递的只是数组的首地址)
一般数组作为形参的时候(函数的参数是数组的时候)void func(int arr[],int n);
传参的时候,第一个元素的地址(&arr[0])或者数组名字(arr)作为数组的地址

9.指针和数组:

int arr[3]={4,5,6}
int *p=arr

可以用指针名表示数组:arr[i]=p[i]
可以用数组名加:*(p+i)=*(arr+i)
指针和数组的区别(可以+i不可以++,sizeof):
一.可以用指针p++,但是不可以数组arr++(指针常量和指针变量)
二.sizeof(arr)表示数组的大小 sizeof(p)表示”指针类型“的大小(sizeof(p)=sizeof(int *)=sizeof(char *,都是指针变量大小一样)

10.二维数组:(组名可以当作指针用)

int  a[3][4]  

a表示行地址(理解为父)
a[0],a[1],a[2]这些表示列地址(理解为子) 数组名是地址,二维数组中a[0]这种就表示数组名a[1]=&a[1][0]
a+1 偏移一整行 a[0]+1偏移一个数据类型位置*a =a[0] => *(a+i)=a[i] (一定要加括号,如果是*a+i表示,先运算*a得到列地址,再对列地址+i偏移) 所以 a[0]+1的地址表示*(a+0)+1
在这里插入图片描述
11.数组指针

int arr[3][4](不可以使用int *p=arr ,arr是行地址)
int (*p2)[4]
p2=arr(真正等同于二维数组名,使用时就相当于把二维数组名字替换成“p2”指针即可)
数组指针:指针偏移的时候,偏移对应大小的数组;
这个指针指向的就是一个数组;

12.函数指针(函数名是一个地址)
类比

     int a int *p    p=&a
	 char c  char *p   p=&c
	 void aaa()   void (*p)()  p=aaa        
	 int bbb(int x,int y)   int (*p)(int x, inty)  p= bbb    -------   使用的时候:(*p)(4,5);

13.指针数组(它是一个数组,里面的数据装着指针)
int *p[4];
函数指针数组 int bbb(int x,int y) int (*p[3])(int x, inty)

14.指针函数(返回指针的函数,返回地址)
int * aaa(int,int) 这种函数的返回值是一个地址

15.二级指针(不能认为他就是可以指向二维数组)

int data=100;
int *p=&data;
int **p2=&p;//存放指针变量的地址
//所以*p2存放的是data的地址(p的内容),**p2就是得到data的值100

一般用在函数调用的时候:

void fun(int (*pdata)[3],int **p2){
//如果不用二级指针,不从main函数中得到p的地址,那么p的指针永远都是野指针。
	
	*p2=(int *)(pdata[2]);
	
}
int main(){
	int i;
	int data[3][3]={1,2,3,4,5,6,7,8,9};
	int *p;
	fun(data,&p);
	
	for(i=0;i<3;i++){
		printf("%d ",*p);
		p++;
	}
	
	return 0;
} 

16.字符串常量和字符串变量

char arr[]="hello" //字符串变量
char *p ="hello" //字符串常量,不允许被修改。
char *p //野指针 ,不可以直接赋值:如 *p=3

17.字符串和字符数组的区别

char a[ ]={'a','b','c'};//元素个数是3(一般这样定义也要记得加'\0'防止编译的时候出现错误)
char a[]="abc";       //元素个数是4 字符串默认会加一个‘\0’表示结束
char a[128]={'\0'}; //字符串初始化

18.sizeof和strlen的区别

char a[]="hello"      //sizeof(a)为6         strlen(a)为5
char arr[128]="hello" //szieof(arr)为128   strlen(arr)为5
char *p="hello"     //szieof(p)为8(指针变量的大小)strlen为5

19.动态开辟内存空间
悬空指针:指针最初指向的内存已经被释放了的一种指针。(所以在free之后要及时让p=NULL,防止出现悬空指针)

malloc函数原型:void* malloc(size_t size) 开辟空间,返回地址

char *p;//野指针
p=(char *)malloc(12);
if(p==NULL){
	printf("malloc error");
	exit(-1);
}
memset(p,'\0',12);//初始化
int len=strlen("qqqqqqqqq1222222222222222");
int newLen=len-12+1; //+1可以用来存放'\0'
realloc(p,newLen);
strcpy(p,"qqqqqqqqq1222222222222222");//用字符串拷贝对p赋值

20.结构体
定义:

struct Student{        //名字开头最好大写
	char name[128];
	int age;
	char sex;
	
};//结构体末尾记得加";",可以在“;”前面加上想要的变量名字

赋值:

struct Student stu1={"张三",12,'g'}struct Student stu2;
strcpy(stu2.name,"李四");//字符串的赋值要用字符串拷贝

结构体数组:struct Student stu3[2]={{"aaa",12,'m'},{"bbb",13,'n'}};

如果使用指针的话,用“->”来访问结构体里面的变量。在指针p++的时候,如果第二次再次使用的话记得把指针重新指向数组头(如下图)
在这里插入图片描述

21.共用体/联合体(不同类型的变量共享一块内存空间)

共用体和结构体的区别:
一.结构体里面的元素有各自的内存空间 ;共用体元素共享空间,空间大小由共用体里面最大类型元素确定
二.结构体元素赋值互不影响 ;共用体赋值会导致覆盖

//场景:学生和老师信息要求记录在同一表格,学生信息有  姓名,性别,班级;
//老师的信息有 姓名,性别,职务 可以得出它们信息的区别在于职务和班级
struct ST {
		char name[32];
		char sex;
		union quBie{
			int class;
			char zhiWu[32];
		}qb;
};
main(){
	struct ST stu;
	stu.qb.class=1;
	struct ST teacher;
	strcpy(teacher.qb.zhiWu,"banzhuren");

}
  1. 枚举
enum WeekDay{ri,yi,er,san,si,wu,liu};
enum WeekDay w;
w=yi; //yi的值为1,默认是ri=0,后面依次加1
//换种方式定义
enum {ri,yi,er,san=7,si,wu,liu}w1,w2;
w1=er;//ri还是0,此时w1的值为2
w2=si;//si的值为8
  1. typedef
typedef int u16;   //u16 a=10(等同于int a=10)
typedef int arr[10] //arr a;  a[0]=10;(等同于int a[10];a[0]=10)
							|
struct Text{				|typedef struct{
	int a;					|	int a;
	char b;					|	char b;
};							|}Demo;
typedef struct Text Demo;	|
Demo t1;					|Demo t1;
							|
### 关于C语言学习笔记和资料 C语言作为一门经典的编程语言,在许多领域仍然具有重要地位。以下是关于C语言的一些核心知识点以及推荐的学习资源。 #### 一、C语言的核心概念 1. **基本语法结构** - C语言是一种面向过程的语言,主要通过函数来实现功能[^1]。 - `main` 函数是程序的入口点,任何C语言程序都必须包含至少一个 `main` 函数。 2. **数据类型** - 基本的数据类型包括字符型 (`char`)、短整型 (`short`)、整型 (`int`)、长整型 (`long`) 和更长的整型 (`long long`)。 - 浮点数分为单精度浮点数 (`float`) 和双精度浮点数 (`double`)。 3. **输入输出操作** 使用标准库 `<stdio.h>` 中定义的功能可以完成简单的输入输出操作。例如: ```c #include <stdio.h> int main() { printf("hello world!\n"); return 0; } ``` #### 二、推荐的学习资源 1. **书籍** - 经典教材《The C Programming Language》由Dennis Ritchie和Brian Kernighan编写,被认为是学习C语言的最佳入门书之一。 - 《C Primer Plus》适合初学者深入理解C语言的基础知识及其应用。 2. **在线教程** - 官方文档和其他权威网站提供了丰富的免费学习材料。例如GeeksforGeeks、Tutorialspoint等平台都有详细的讲解和实例。 3. **实践工具** - 推荐使用主流编译器如 GCC 或 Clang 来运行和调试代码。这些工具不仅支持命令行环境下的开发工作流,还能够很好地与其他IDE集成在一起提供更加友好的用户体验界面。 4. **项目实战** 实际动手写一些小型的应用程序可以帮助巩固所学的知识点并提高解决问题的能力。可以从最基础的例子开始尝试构建自己的工程项目文件夹管理方式等等逐步提升复杂度直到完全掌握为止。 #### 总结 对于想要深入了解或者刚刚接触这门古老却充满活力的技术的人来说, 结合理论阅读加上不断的练习才是王道!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值