2020年九月第二周学习
- 两种const指针区别
- 指针 + 1
- 内存申请与释放
- 字符串操作
- 结构类型
- 格式化的输⼊输出
- 文件
两种const指针区别
1.指针是const
表示一旦得到了某个变量的地址,不能再指向其他变量。
int *const q = &i; //q 是 const,q存放的是const的地址,地址不能改变,所以不能再指向其他变量。则:
*q = 26; //OK
q++; //ERROR
2.所指的是const
表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)具体操作:在给一个函数传入变量的时候,不希望在函数中被改变则可以使用这个方式传入参数。
const int *p =&i; //p 是const,不能改变p的值,但是可以通过改变i的值来实现值的改变。
则:
*p = 26; //ERROR! (p)是const不能改变
i = 26; //OK
p = &j; //p的值可以改变,即指针p的指向可以改变。
int i;
const int *p =&i;
int const *p =&i;
int *const p =&i;
判断哪个被const了,就看const是在*前面还是后面。前两种代表的意思相同,都是不能通过指针改变值,最后一种是指针的地址不能改变。
数组可以看做是一种 int *const p的指针,不能改变地址,也就不能实现a[] =b [];操作。
指针 + 1
指针加一实际上加的是sizeof的值,sizeof(char)=1,一个char类型的指针加一加的就是1;而sizeof(int)=4,一个int类型的指针加一加的是4;地址值会偏移对应类型的大小。
*(p+n) <----> ac[n] 两者等价
加密方式设想,如int类型,不从第一个二进制开始写入有效数据,而是从一个不为4倍数的地址开始写入。
内存申请与释放
首先需要引入stdlib.h的头文件。
void* malloc(size_t size);
定义一个数组时:
int* a = (int*)malloc(size*sizeof(int));
void free(void *ptr);
释放已获得的内存时:
free(a);
字符串操作
包含在一个名为string,h的头文件里面。
1.strlen
size_t strlen(const chars);返回s的字符串长度(不包括结尾的\0)
而sizeof输出的就是字符串的大小,这个是包含最后一个\0的。
2.strcmp
int strcmp(const chars1,const char *s2);比较两个字符串大小。每个元素对应相比,输出为正,则s1的所有元素的ASCALL码和大,为负则小。
3.strcpy
char *strcpy(char *restrict dst,const char *restrict src);把src的字符串拷贝到dst。
关键字restrict表示src和dst不重叠。
有返回,返回dst;
4.strchr
char strchr(const chars,int c);在字符串s中从左侧寻找c第一次出现的位置。正常返回指针,返回NULL表示没找到。
5.strrchr
char strchrr(const chars,int c);在字符串s中从右侧寻找c第一次出现的位置。正常返回指针,返回NULL表示没找到。
6.strstr
char *strstr(const char *s1,const char *s2);在s1中寻找s2这个字符串。
7.strcasestr
char *strcasestr(const char *s1,const char *s2);
在s1中寻找s2这个字符串,无论大小写。
结构类型
1.枚举
enum 枚举类型名字{名字0,……,名字n};
他们的类型是int,值依次从0到n。
2.结构
struct结构类型可以定义几个具有相同含义的变量,方便引用和数据专递。
struct date {
int month;
int day;
int year;
}; //这是定义了一个date结构类型
struct date today;
//这是定义了一个date结构类型的变量today
today.month =11;
today.day = 31;
today.year = 2014;
//这样来对today结构赋值
/*或者*/
struct date today = {11,31,2014};
struct date *p =&today;
//下面这两个表达式是等价的
(*p).month =12 ;
p->month = 12 ;
可以用数组套结构,结构套数组。。。套娃。
3.类型定义
typedef,可以给结构体命名。
typedef struct node {
int data;
struct node *next;
} aNode;
4.联合
union,多个成员使用一个空间。
可以通过union得到一个int的各个字节。
格式化的输⼊输出
printf
%[flags][width][.prec][hlL]type
1.flag
Flag | 含义 |
---|---|
- | 左对⻬ |
+ | 在前⾯放 + 或 - |
(space) | 正数留空 |
0 | 0填充 |
2.width或.prec
3.hIL
4.type
scanf
%[flag]type
1.flag
2.type
文件
FILE* fopen(const char * restrict path, const char restrict mode);
int fclose(FILE stream);
fscanf(FILE, …)
fprintf(FILE, …)
二进制读写
size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
在文件中定位
long ftell(FILE *stream);
int fseek(FILE *stream, long offset, int whence);
SEEK_SET:从头开始
SEEK_CUR:从当前位置开始
SEEK_END:从尾开始(倒过来)