C语言重难点归纳(3)

93 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

一、栈的生成方向以及内存存储方式

  1. 生长方向
  • 栈底 --- 高地址

  • 栈顶 --- 低地址

  1. 内存存储方式
  • 高位字节数据 --- 高地址

  • 低位字节数据 --- 低地址

小端对齐

二、空指针和野指针

  1. 空指针 ---不允许向NULL和非法地址拷贝内存
  2. 野指针
  • 未初始化指针

  • malloc后也free了,但是指针没有置空

  • 指针操作超越变量作用域

  1. 空指针可以释放 ,但是野指针不可以释放

三、指针的步长

  1. 指针变量+1 之后 跳跃的字节数量
  2. 解引用的时候,取的字节数
  3. 对自定义数据类型进行练习
  • 如果获取自定义数据类型中属性的偏移

  • offsetof( 结构体 , 属性 )

  • 头文件 #include<stddef.h>

四、指针的间接赋值

  • 满足条件
  1. 一个普通变量和一个指针变量(或者一个实参一个形参)

  2. 建立关系

  3. 通过*进行赋值

五、指针做函数参数的输入输出特性

  1. 输入特性: 在主调函数中分配内存,被调函数使用

  2. 输出特性: 被调函数中分配内存,主调函数使用

六、字符串强化训练

  1. 字符串是有结束标志\0

  2. 利用三种方式对字符串进行拷贝

利用 []

利用指针

利用`while` (*dest++ = *source++){}
  1. 利用两种方式对字符串进行反转
利用[]

利用指针

七、格式化字符串

  1. 可以利用sprintf对字符串进行格式化

  2. sprintf(目标字符串, "格式",占位参数…);

示例程序如下

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//sprintf格式化字符串
void test01()
{
	char buf[1024];
	memset(buf, 0, 1024);

	sprintf(buf, "今天是%d年 %d月 %d 日\n", 2018, 5, 6);

	printf("%s",buf);


	//字符串拼接
	memset(buf, 0, 1024);
	char str1[] = "hello";
	char str2[] = "world";
	int len = sprintf(buf, "%s%s", str1, str2); //sprintf返回的是字符串的长度
	printf("buf:%s len:%d\n", buf, len);


	//数字转字符串
	memset(buf, 0, 1024);
	int num = 100;
	sprintf(buf, "%d", num);
	printf("buf:%s\n", buf);

	//设置宽度 右对齐
	memset(buf, 0, 1024);
	sprintf(buf, "%8d", num);
	printf("buf:%s\n", buf);

	//设置宽度 左对齐
	memset(buf, 0, 1024);
	sprintf(buf, "%-8d", num);
	printf("buf:%sa\n", buf);

	//转成16进制字符串 小写
	memset(buf, 0, 1024);
	sprintf(buf, "0x%x", num);
	printf("buf:%s\n", buf);

	//转成8进制字符串
	memset(buf, 0, 1024);
	sprintf(buf, "0%o", num);
	printf("buf:%s\n", buf);


}

int main(){

	test01();

	system("pause");
	return EXIT_SUCCESS;
}