C进阶
筱羊冰冰
这个作者很懒,什么都没留下…
展开
-
初入按位运算符和位移运算符
前言包括逻辑运算符和位移运算符按位逻辑运算符作用于整数类型和char类型,并且只针对一个位而不是整个的数据。取反运算符‘~’unsigned char a = 2;//00000010所以~ a位=为11111101和乘法类似,不改变原来数据的值,但是会产生一个新值。按位与‘&’(1101) & (0111) = (0101)对每一个位都取一个反,结果就是每一位的结果还有一个缩写的形式,a &= (0111)按位或‘|’和上面的都差不多,也有缩写按位异或‘^原创 2020-10-24 14:55:23 · 158 阅读 · 0 评论 -
结构体中的复合字面量和伸缩数组成员、匿名结构
复合字面量(c99)有时候我们只需要使用某一个特定的结构体一次,那么就可以采用这样的方式。规则:要赋值的变量=(变量类型){初始化列表};struct book{ int data; int data_2;};int main(){ struct book book_one = (struct book){10,20}; printf("%d %d",book_one.data,book_one.data_2);}没有结构体变量的名字,所以是一次性的。原创 2020-09-13 16:23:38 · 324 阅读 · 0 评论 -
动态分配内存与销毁(malloc、free、malloc、realloc)
malloc函数在数组分配空间的时候,如果十个例子九个是10个元素以内,但是有一个却为100+的,如果为了这一个数组而创建一个很大的数组,那么显然是不合理的,所以我们还要有其他的方式来创建一个动态数组。比如vla数组(变长数组),就是一个不错的选择,今天我们还有另外一个更好的选择,malloc函数。vla数组参见之前的博客:变长数组——VLA和vla数组一样,动态数组不是将一个小数组拓展成一个大数组,而是在创建的时候才确定数组的大小。函数原型:void *malloc(size_t);//siz原创 2020-09-01 21:20:46 · 790 阅读 · 0 评论 -
字符串函数(strlen、str(n)cat、str(n)cmp、str(n)cpy)
头文件 string.hstrlen函数计算字符串长度,从一个char地址出发一直到空字符,但空字符不计入总数。用法:strlen(char*)举例: char a[70]="I hope you can give me a like."; fputs(a,stdout); putchar('\n'); printf("%d\n",strlen(a));//总字符个数 printf("%d\n",strlen(&a[3]));//从一半开始传入地址,原创 2020-08-29 13:31:20 · 776 阅读 · 0 评论 -
字符串的输入输出函数(gets、fgets、gets_s及对应的输出函数)
首先声明例子都是char数组且足够大,如果是指针就需要手动分配空间。scanf函数这个不用说了吧,scanf("%s",a);就能将输入存储到a这个数组里面。问题scanf函数遇到空字符就会结束,(空字符有空格、回车、tab键等等),所以当你输入 i love you 时,数组内存储的就是一个i了,这样的程序七夕节当然是不能用的了,所以接下来就产生了一些其他的函数。注意是从第一个非空字符开始的,所以" i love you"读入的也是i;还可以用%10s这样的数字限定读取长度,前面的原创 2020-08-27 22:22:12 · 3722 阅读 · 0 评论 -
指针数组和数组指针的区分
咳咳,这个问题我在学完了整本书都还没区分开,今天看到了就提一下。指针数组int *p[20];//或许写成 * p[20]更好理解由于优先级的问题,p先和20结合,然后加上星号,所以是20个指针构成的数组数组指针指向一个数组的指针int (*p)[20];首先p和星号结合形成指针,指向这个数组的第一位。数组指针指向一个数组的时候,我们给p的赋值是整个数组的地址(&a),而不是第一个元素的地址(a)虽然在16进制输出中我们可以看到这两个是相同的,但是呢,如果将a赋值给p,就会发原创 2020-08-25 15:04:48 · 161 阅读 · 0 评论 -
变长数组——VLA
背景比如我们需要调用函数计算几个数组的所有数据的总和,如数组a[5][2]、b[3][2]、c[7][2]int sum(int a[][2],int row);函数原型就可以这样来定义(省略第一位的数字是允许的,毕竟可以当成指针处理。)然后附上行数即可。但是我们难免需要计算不同列数的数组,即不同大小的数组,那么函数的定义就会很难处理,所以我们有了变长数组的概念。变长数组这里指的并不是将一个定义好的数组的长度改变了,如将a[4][3]改成a[3][4],而是不限定数组的长宽,用变量来指定维度。原创 2020-08-25 13:50:47 · 560 阅读 · 0 评论 -
关键字const锁定数组数据
引言数组在传入函数或者是在正常使用的情况下,我们可能不希望数组的数值改变,但是在程序的某个位置我们还是有可能因为疏忽改变了特定数组的内容。那么此时我们就需要一种方式来锁定数组保证其不发生改变。正常使用和函数调用时的数组我们都知道用const关键字可以创建一些常量,使之不能发生改变,那么数组页相同,创建const数组即可:const int num[5]={1,2,3,4,5};但是如果是在函数调用过程中我们不希望改变数组,但是在其他位置却希望改变数组,那么对应的函数可以写为:long sum(原创 2020-08-24 21:46:26 · 423 阅读 · 0 评论