C语言细节总结笔记
C语言细节总结笔记
Table of Contents
1 三步异或法交换数字
a ^= b;
b ^= a;
a ^= b;
2 做差法交换数字
x=x+y;
y=x-y;
x=x-y;
3 按n位置位
先置0 a&=~(1<<n) 再置1/0,i为1或0 a|=(i<<n)
5 辗除法求最大公约数
while(b!=0)/*利用辗除法,直到b为0为止*/ { temp=a%b; a=b; b=temp; } printf("公约数:%d\n",a);
6 求数组元素个数方法
sizeof(a)/sizeof(a1)
7 运算符优先级
8 scanf处理字符串
scanf("%[\n]",str); 用到正则表达式
9 指针题
- 指针的加减法:
char a = 100;
char *p = &a;
若:p的地址为0x20008000,则
p+1=0x______; 0x20008001
*p + 1 =0x_____; 101(我写的是10进制)
(int )p + 1 = 0x______; 0x20008001
(int *)p + 1 = 0x______; 0x20008004
(char *)p + 1 = 0x______; 0x20008001
(char)p + 1 = 0x______; 1 - a &a &a+1
char a2;
a :=a1
&a :=a1 本质发生变化 数组地址 现象如下
&a+1 :=a2
- 指针
(*p)++
++(*p)
*(\\ *(p++)p)
*p
- 设有二维数组
int a3, 4= {0, 1, 2, 3,4, 5, 6, 7, 8, 9, 10, 11};
请说明以下表示形式的的含义:
并写出地址值,设a的起始地址为0x2000.
a表示 二维数组名,那么 a==&a1
- 数组 int a3, 4, 请用3-4种方法表示a5, 6的地址?
a1+1*4+2 0行开始 1
*a+1*4+2 2
&a5, 6 1行开始 3
*(1)+2 4
a5+2 5
*(a+2)-2 2行开始 6
a6-2 7
*(*(&a+1))-6 3行开始 8
*(*(&a+1)-1)-2 末尾开始 9
10 int const *p问题
const int *p 定义指向const的指针(指针指向的内容不能被修改) int const p 定义指向const的指针(指针指向的内容不能被修改) int const p 定义const指针(由于指针本身的值不能改变所以必须得初始化) const int* const p 指针本身和它指向的内容都是不能被改变的所以也得到初始化 int const* const p 指针本身和它指向的内容都是不能被改变的所以也得到初始化
11 数组和指针
12 字符数组
char *p = "Hello World!"; //它存储在只读存储区,不能修改,如果修改会出现段错误
13 二维数组
15 指针数组
16 指针函数
17 函数指针
18 函数指针数组
19 存储方式
data段:初始化的全局变量和静态变量
bss段 :未初始化的全局变量和静态变量, 自动清零
代码段:常量 代码
堆:用户分配,用户回收
栈:系统分配,局部变量