小知识点
将字符数字转换为整型数字:-'0' 操作 ascii码相减
++i和i++的区别:
-
k=i++:可以看成两个操作:①
k=i;②i=i+1; -
k=++i: 分成两个操作:①
i=i+1;②k=i;在for循环:
for(;;i++);for(;;++i);循环次数和 语句中的i值相同
for(i=1;i<N;i++){#1
语句
}
for(i=1;i<N;++i){#2
语句
}
#1和2执行次数是一样的,for循环的执行顺序是:
#①初始化时执行:i=1;
#②然后再判断i<N;成立则执行语句;
#③最后执行i++(或++i);
#之后重复执行②③;直到②不满足;
数组名arr和&arr的异同
相同点:
arr=&arr=&arr[0]指向的是同一个地址不同点:
代表的意义不同
arr是数组首元素的地址,而&arr是数组的首地址;
具体体现在:
若arr为int型数组,且有100个元素,则:
arr+1为数组下一个元素的地址=arr+1*4: (int型占4个字节,比例因子为4)
&arr+1为这个数组后面的地址= arr+1*100*4,比例因子为400,即整个数组的大小
验证:
程序:
#include "stdio.h"
int main(){
int arr[100];
printf("&arr=%p &arr+1=%p\n",&arr, &arr+1);
printf(" arr=%p arr+1=%p\n",arr, arr+1);
printf("\n");
return 0;
}
运行结果:
&arr=0077F8B0 &arr+1=0077FA40
arr=0077F8B0 arr+1=0077F8B4
NULL、'\0'、'0'和0
来源
本质上NULL和'\0'的值都为0
NULL: 空指针,#define NULL (void*)0
'\0': 字符串结束符(是空字符),非打印字符,printf、strlen和strcmp遇'\0'停止
'0':字符0
0:数值0
printf函数打印对齐
左对齐:printf("%-4d\n",a):若a宽度小于4,则在右边补空格;若a宽度大于4,正常输出
右对齐:printf("%4d\n",a);:若a宽度小于4,则在左边补空格;若a宽度大于4,正常输出
printf 输出格式控制:
| short | int | long | |
|---|---|---|---|
| 八进制 | %ho | %o | %lo |
| 十进制 | %hd | %d | %ld |
| 十六进制 | %hx | %x | %lx |
若想要输出前缀只需要在%后面加# 例:%#x |
各种进制相互转换
数值数字<->字符数字
/*将字符转换成数字*/
int char_to_num(char ch)
{
if(ch>='0' && ch<='9')
return ch-'0'; /*将数字字符转换成数字*/
else
return ch-'A'+10; /*将字母字符转换成数字*/
}
char num_to_char(int num)
{
if(num>=0 && num<=9)
return (char)('0'+num-0); /*将0~9之间的数字转换成字符*/
else
return (char)('A'+num-10); /*将大于10的数字转换成字符*/
}
指针数组和多维数组
一个求二维数组和的程序:
#include <stdio.h>
int main(){
static int num[][4]={{1,2,3,4},{5,6,7,8}};
static int* pn[]={num[0],num[1]};
static int sum[]={0,0};
for(int i=0;i<2,i++){
for(int j=0;j<4;j++)
sum[i]=*pn[i]++;
printf("line:%d sum:%d\n",i,sum[i]);
}
}
num、pn和sum都被分配在静态区即首地址是确定的:
pn=&pn[0];
pn[0]=num[0]=&num [0] [0];
pn[1]=num[1]=&num [1] [0];
关键代码 sum[i]=*pn[i]++等效于:
①sum[i]=*pn[i]=*(pn+i);
②pn[i]=pn[i]+1=*(pn+i)+1;
结构体和联合体
存放和访问:
结构体中的数据成员存放在存储器中的一段连续的存储区中,指向结构的指针就是其第一个字节的地址。编译器在处理结构型数据时,根据每个成员的数据类型获得相应的字节偏移量,然后通过每个成员的字节偏移量来访问结构成员。
结构体作为入口参数:
按值传:会将结构体的成员拷贝到调用过程的栈帧中的参数区;即将其作为实参存到参数区
按地址传:将结构体的首地址拷贝到栈中;
联合体中的各个成员共享存储空间,即同一时刻联合体的存储空间中仅保存有一个成员数据。联合体存储空间是按照成员中数据长度最长的分配空间大小。
数据的对齐
long double 80位扩展精度
IA-32:32位指令集架构
x86-64:64位指令集架构

浙公网安备 33010602011771号