c语言笔记_2

1.

C语言中常用的整型变量的输出格式符有以下几个:

  • %d:用于输出十进制有符号整数。
  • %u:用于输出十进制无符号整数。
  • %o:用于输出八进制整数。
  • %x:用于输出十六进制整数(小写字母)。
  • %X:用于输出十六进制整数(大写字母)。

2.

%#8x 是一个格式化字符串,用于以十六进制形式打印一个整数,并指定字段宽度为8个字符,并且在输出时添加十六进制的前缀 0x。#的作用就是添加前缀0x。

%6.2f 是一个格式化字符串,用于以浮点数形式打印一个小数,并指定字段宽度为6个字符,其中包括小数点和小数部分的位数为2位。

3.

对于 int 类型的变量,应该使用 %x 格式化字符串来以十六进制形式打印整数。同样地,对于浮点型变量,应该使用 %le 格式化字符串来以科学计数法形式打印浮点数。

4.

在 scanf 函数中使用 %3d 表示读取一个整数,其中整数的最大宽度为 3 个数字字符。

5.这样的操作是不允许的:

    int a[10]={15,12,7,31,47,20,16,28,13,19},*p;
    for(p=a;a<(p+10);a++); 

a是个数组,循环到最后会越界。

6.

    int a[10]={15,12,7,31,47,20,16,28,13,19},*p;
    p = a;
    printf("%d\n", *p++);//15
    printf("%d\n", *p);//12

*和++的优先级相同,但它们是从右往左算的,先执行p++,不过p++会先将p的值给*,然后再执行p的自增。

7.

    int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}, (*p)[3];
    p = a;
    printf("%d\n", p+1);//6422012
    printf("%d\n", *(p+1));//6422012
    printf("%d\n", *(p+1)+1);//6422016
    printf("%d\n", *(p[0]+2));//3

p是一个指针,它指向了一个含三个int型数据的数组。a是一个二维数组,它的类型是int (*)[3]。

p也是int (*)[3]类型,所以它们类型一致,可以进行赋值运算。如果任一一个是int (*)[2],

类型也是不匹配的。当把a赋值给p后,p其实就相当于指向了a的第一层的那3个元素。

如果不赋值,p指向的就是3个int型数据。赋值的操作,就是在把p指向a。
所以,p也是a数组第一个元素的地址,也就是&a[0]或&p[0]。那么p+1指的就是第一层的第二个元素的地址。

    printf("%d\n", &p[0]);//6422000
    printf("%d\n", p+1);//6422012

可以看到,&p[0]和p+1正好差了3个int型的大小。

那么*(p+1)就是在说访问第一层的第2个元素,但这个元素还是个地址,是{4,5,6}这个数组的首地址。

虽然p+1和*(p+1)的值一样,但p+1还在第一层,而*(p+1)在第二层,只不过因为第一层的地址和第二层的首地址一样而已。

那么*(p+1)+1就是{4,5,6}的第二个元素的地址。

而*(p[0]+2),p[0]指的是{1,2,3}这个数组的首地址,已经进入了第二层,+2就成了3的地址。
再通过*访问这个地址的值,也就是3。
需要注意的是,*(p+1)中的p在第一层,而p[0]却是代表了进入了第1个元素的第二层。

所以它是{1,2,3}中1的地址。

8.printf("\033[1;33m Hello World. \033[0m \n");\033[0m--清除颜色格式

可以以这样的方式切换输出文本的颜色,shell脚本中也有类似应用。

none = "\033[0m"        black = "\033[0;30m" 

dark_gray = "\033[1;30m"        blue = "\033[0;34m" 

light_blue = "\033[1;34m"         green = "\033[0;32m" 

light_green = "\033[1;32m"        cyan = "\033[0;36m" 

light_cyan = "\033[1;36m"        red = "\033[0;31m" 

light_red  = "\033[1;31m"        purple = "\033[0;35m" 

light_purple = "\033[1;35m"        brown = "\033[0;33m" 

yellow = "\033[1;33m"          light_gray = "\033[0;37m" 

white = "\033[1;37m"

9.

32位机和64位机的区别是:32位机代表地址的位数是32位,也就是2^32。

那么就是从00000000 00000000 00000000 00000000到11111111 11111111 11111111 11111111。

每一位都可以代表一个存储单元,而每个存储单元的大小是8比特,也就是1字节。
所以,2^10=1KB,2^20=MB,2^30=GB。那么2^32就是4GB。也就是说,32位的机器,最多可以

寻找到4GB的数据。

那么以此类推,64位机就是2^64个地址,是2^32乘以2^32,这个数值是很大的,理论上可以代表很多个存储单元,远超了现在的内存的容量大小。

10.

#include 

union node
{
	unsigned int m;
	char c;
};

int main(void)
{
	union node data;
	data.m = 0x12345678;

	printf("%x\n", data.c);//78
	
	return 0;
}

在内存中,地址值大的就是高地址,地址值小的就是低地址

在存储数据时,分两种方式存储方式,大端和小端。

比如存储一个8字节的数据,0x12345678,从左到右就是高地址到低地址。

大端存储时,高地址数据就存到高地址,低地址数据就存到低地址,

也就是12345678这样存。

小端存储时,低地址数据存到高地址,高地址数据存到低地址,

也就是78563412这样存。现在一般的机子都是小端存储。

比如在上面的程序中就可以看出,存的是12345678,但打印出来的是78。

你可能感兴趣的:(c语言,笔记)