C语言 遗忘知识点

%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
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值