小知识点

将字符数字转换为整型数字:-'0' 操作 ascii码相减

++ii++的区别:

  • 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

各种进制相互转换

C语言实现任意进制转换代码及解析

数值数字<->字符数字

/*将字符转换成数字*/
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位指令集架构

posted @ 2021-07-22 00:21  ly探长  阅读(112)  评论(0)    收藏  举报