%m.nf 右对齐
%-m.nf 左对齐
一共m列,小数点以后有n个
优先级:
! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
break 提前终止循环
continue提前结束本次循环
变量的存储方式:
静态存储
动态存储
局部变量的存储方式:
自动变量 auto 存放在动态存储区
静态局部变量 static 存放在静态存储区
寄存器变量 register 存放在cpu中的寄存器中
全局变量的存储都是放在静态存储中
内部函数 static
外部函数 extern
通过指针引用数组元素
下标法 a[ i ]
指针法
* ( a + i ) 或者 * ( p + i )
a 是数组名 p 是指针
p++
* p
p++ 使得p指向下一个元素,然后再执行*p 得到a[ 1 ] 的值
* p++
由于++ 和 *
同一个优先级,结合方式是自右向左 因此等价于 *(p++) 相当于 *p 和 p++ 也就是先取p指针指向的元素的值 先引用p 实现 *p 的取值运算 然后再使p指针加一
*(p++) 和 *(++p)的作用不一样
*(p++)等价于 *p ;p=p+1;先取p指向的值再让指针加一
*(++p)等价于 p=p+1; *p ; 先让指针p+1 再取p指向的值
++(*p) 是p指向的元素值加一
指针是const
表示一旦得到了某个变量的地址,不能再指向其他的变量
int * const q=&i;q指针是const q 的值不可以被改变 也就是q 不能再指向别人了 关系是永久的
*q=26;可以允许赋值
但是不能执行q++; 因为指针已经不能被修改所指的int 是const
表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)
const int * p = &i;
*p = 26; 这个是错误的 因为 (*p) 是const 不能通过p进行修改
i=26; 是可以的
p=&j 也是可以的 因为p指针可以再指向别的地址
eg: int i ;
const int* p1=&i; //这个是值不可以被修改
int const* p2=&i; //这个是值不可被修改
int *const p3-&i; //这个是指针不可被修改
//判度哪个被const了的标志是 const 在* 的前面还是后面
//const在* 的前面 就是值不可以被修改
//const在* 的后面 就是指针不可以被修改
const 数组:
const int a[] ={1,2,3,4,5,6};
数组变量已经是const 的指针了 这里的const表明数组的每一个单元都是const int
所以必须通过初始化进行赋值
保护数组值
因为把数组传入函数是传递的是地址,所以那个函数不可以修改数组的值
为了保护数组不被函数破坏,可以设置参数为const
int sum( const int a[] , int length);
多维数组元素的地址
int a[3][4]={ {1,3,5,7}, {2,4,6,8}, {9,11,13,15} } ;
a 是一个二维数组名 a数组包含三行,即三个行元素a[0],a[1],a[3]
每一行元素又是一个一维数组,包含四个元素,即四个列元素
a--> a[0]--> |1 |3 |5 |7 |
a[1]--> |2 |4 |6 |8 |
a[2]--> |9 |11 |13 |15 |
如果 a[0]的值等于2000, 那么a[0]+1 的值等于2004 即a[0][1]
所以: a[0]+0 , a[0]+1 , a[0]+2 , a[0]+3
分别为:a[0][0], a[0][1] , a[0][2] , a[0][3] 的地址
即: &a[0][0], &a[0][1] , &a[0][2] , &a[0][3]
a[0]和 *(a+0) 等价
a[1]和 *(a+1) 等价
a[i]和 *(a+i) 等价
所以 a[0]+1 和 *(a+0)+1 都是 &a[0][1]
a[1]+2 和 *(a+1)+2 都是 &a[1][2]
得到a[0][1]的值 就等于 *((a+0)+1 ), *( a[0]+1 ), *( a + 1 )
总结: *(a[i]+j)和 *( *(a+i)+j )都是a[i][j]的值!
C语言的函数调用的三种方式
传值调用:就是把一个变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,形参运算后在把值返回。
函数中改变的值是不能影响到外界的,因而在函数里对形参的改变不会影响到函数外的变量的值。
传地址调用:就是将变量的地址直接传入函数,它把一个变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。
引用调用:引用调用实际是通过指针来实现的,把变量的引用传入函数;能达到使用地址调用的效果,可是使用方式如传值调用,函数可以对其值进行修改。
整体变量和局部变量的区别?
局部变量(Local Variable):定义在函数体内部的变量,作用域仅限于函 数体内部。离开函数体就会无效。再调用就是出错。
全局变量(Global Variable):定义:所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件。
整体变量和局部变量的区别: 作用域不同
局部变量:只在本函数范围内有效,就是一个大括号内{ },并且在运行该函数的时候才给局部变量分配内存空间,函数结束则释放局部变量空间
全局变量:在整个程序内都有效,并且在运行前事先分配好内存给全局变量,程序结束时才释放
按位与,按位或,异或 左移 右移 ;
指针最优,单目运算优于双目运算。如正负号。
先算术运算,后移位运算,最后位运算。
首先是优先级:
先计算 左移右移 根据 自左向右
再计算 & ^ | 根据 自左向右
1.按位与: & 进行二进制与运算
两个同时为1 结果才为1 否则为0;
2.按位或:| 进行二进制或运算
参与运算的两个数只要有一个为1 其值就为1
3.异或: ^
参与运算的两个数 如果相应位为异 则该结果为1
(相应位的值不同为1 相同为0 )
eg:0^1=1 ; 0 ^ 0=0;
4.左移 <<
将二进制位全部左移若干位,左边的二进制位丢弃,右边的补0;
操作数每左移一位相当于该数乘以2
a=a<<2 : 将a的二进制位左移2位,右部补0;
5.右移 >>
将二进制位全部右移若干位,真树左部补0,复数左补1,右边丢弃。
操作数每右移一位就相当于该数除以2;
eg: 1 << 3 + 2 & 7等于
①。3+2=5
②。1<<5 = 0000 0001 往左移5位 相当于 0010 0000
③。0010 0000 & 0000 0111 等于0