【C++】%m.ns打印,const和*,运算符优先级,int (*a)(int)和 int (*a[10])(int) ,printf和大小端,二维数组(每日小细节32)

目录

1.%m.ns打印字符串是什么意思?

2.const和*

3.运算符优先级

4.int (*a)(int)和int (*a[10])(int)

 5.printf和大小端

6.二维数组


1.%m.ns打印字符串是什么意思?

m:输出字符串的宽度

n:左起截取目标字符串的n个字符,右对齐,补充空格

如果字符串长度>n>m  此时m的作用失效,只有n起作用

如果n>字符串长度,遇到\n自动停止打印

如果%-m.ns代表左对齐

例如

 m=3说明截取宽度是3

n=2左起截取2个字符

没有负号(-)默认右对齐,不够的自动补充空格

对于浮点数的打印还,m还是一样的意思,但是n表示精度

m=10表示截取宽度是10,n=2表示小数点之后保留两位 ,不够的宽度用空格补齐

2.const和*

看这三个p

简单介绍一下常量指针和指针常量

常量指针:指针所指向空间的值不能改变,不能通过指针解引用修改指针所指向空间的值,但是指针的指向可变

指针常量:指针是常量,指向不能变,但所指空间的内容可以改变,可用指针解引用改变所指向的空间的值

这个太晦涩,简单来说就是const和*的位置决定到底谁不能变(const修饰谁,谁就有常性)

const int * a   :const在*前,说明解引用之后的内容被const修饰,不能改变,具有常属性

即int*指针指向空间的值不能改变——常量指针

int const * a:const还在*前,和上面一样

int * const a:现在a被const修饰,a类型是int*,指针被修饰——指针常量,指向不能改变,但所指空间的内容可以变

3.运算符优先级

可以自己查表,但是有一些很常见的:

括号的优先级最高

[ ] > * > +

还有这些符合运算符的优先级是比+-*/低的

4.int (*a)(int)和int (*a[10])(int)

第一个*和a结合,是一个指针,指针指向是int (int)即有一个整型参数int,返回值是int

第二个[ ]优先级高于*,所以a[10]表示一个数组,数组类型是int (*)(int)

这个*是指 指针,指针指向int (int),也就是指向函数,函数的返回值int,有一个整型参数是int

 5.printf和大小端

 回顾大小端机器

小端:低位存低地址

大端:低位存高地址

看一下,题目说这是一个小端机

如果是大端机

现在我们调用printf函数

创建函数栈帧(栈是从高地址生长到低地址)

printf的变量读取是从右往左,也就是先读取c 

 

并且栈是先进后出

所以先在栈的低地址读取,%d打印,会从低地址(栈顶)一次读取4字节

所以最终结果就是1 0 2

6.二维数组

二维数组的每一行初始化,必须是连续的,也就是不可以{0,,2}初始化

初始化不可以省略列数

并且计算二维数组**a[3][4]的时候,首先明确这个二维数组三行四列 ,数组存放指针(32位下4字节)

所以所占空间为3*4*4=48字节

猜你喜欢

转载自blog.csdn.net/weixin_71138261/article/details/129693962