版权声明:本文为博主原创文章,如未特别声明,均默认使用CC BY-SA 3.0许可。 https://blog.csdn.net/Geek_of_CSDN/article/details/80413431
记录一些贫僧可能会忘记的东东。
switch
case如果后面没有加break的话会一直继续向下运行,而不是直接跳出switch选择。
例子:
switch(grade)
{
case 'A': printf('...');break;
case 'B': ...;break;
default: ...;
}
执行到switch
的时候会把grade
和case
后面的常量进行比较,没有匹配的就运行default
后面的指令。
循环结构
do while记得在while后面加;
。
数组
数组名本身就是地址(贫僧听说编译器会在编译的时候把数组名换成内存地址,没有验证这个说法,不过这样的话就可以理解为什么scanf
的时候数组名前不需要&
,数组名可以直接赋值给指针变量)。
指针
一定要记得结合内存操作来理解指针。
在用指针访问二维数组的时候是先行后列,例如*(p + 1) + 2
就是第1行第2列的地址,*(*(p + 1) + 2))
就是这个地址里面的内容。(听说不建议这样用)
其实函数名也是个地址,所以可以直接p = max()
,然后(* p)()
来调用max()
。不过要记得先定义好,例如int (*p) (int, int)
对应int max (int a, int b)
。
字符数组和字符指针的区别
当char * a = "boo";
时,赋给字符指针的是字符串的第一个地址,等价于
char *a;
a = "boo";
但是字符数组初始化时赋值char str[4] = "boo";
不等价于
char str[4];
str[] = "boo";
数组可以在定义时对各元素赋初值,但是不能对字符数组里面所有元素进行整体赋值。
另一个区别:
编译时字符数组会被分配若干存储单元,而字符指针只分配一个。
定义了字符指针后要及时指定指向,不然可能会指向存放了有用数据的内存段,后果可能很严重。具体的可以看看这个。