开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情。
一、栈的生成方向以及内存存储方式
- 生长方向
-
栈底 --- 高地址
-
栈顶 --- 低地址
- 内存存储方式
-
高位字节数据 --- 高地址
-
低位字节数据 --- 低地址
小端对齐
二、空指针和野指针
- 空指针 ---不允许向NULL和非法地址拷贝内存
- 野指针
-
未初始化指针
-
malloc后也free了,但是指针没有置空
-
指针操作超越变量作用域
- 空指针可以释放 ,但是野指针不可以释放
三、指针的步长
- 指针变量+1 之后 跳跃的字节数量
- 解引用的时候,取的字节数
- 对自定义数据类型进行练习
-
如果获取自定义数据类型中属性的偏移
-
offsetof( 结构体 , 属性 ) -
头文件
#include<stddef.h>
四、指针的间接赋值
- 满足条件
-
一个普通变量和一个指针变量(或者一个实参一个形参)
-
建立关系
-
通过
*进行赋值
五、指针做函数参数的输入输出特性
-
输入特性: 在主调函数中分配内存,被调函数使用
-
输出特性: 被调函数中分配内存,主调函数使用
六、字符串强化训练
-
字符串是有结束标志
\0 -
利用三种方式对字符串进行拷贝
利用 []
利用指针
利用`while` (*dest++ = *source++){}
- 利用两种方式对字符串进行反转
利用[]
利用指针
七、格式化字符串
-
可以利用
sprintf对字符串进行格式化 -
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;
}