黑马程序员-①C语言查漏补缺总结(上)

----- <a href="http://www.itheima.com" target="blank">ios培训</a>、<a href="http://www.itheima.com" target="blank">ios培训</a>、期待与您交流! ---------

交换两个数的牛逼方法

第一种方法

{
   a = b-a;
   b = b-a;
   a = b+a;
}

第二种方法

{
   a = a^b;  
   b = a^b;  
   a = a^b; 
}

if语句

if的第一种结构

 if(条件)
 {
 	语句;
 }

if的第二种结构

if(条件1)
 {
 	语句;
 }
 else{
	语句;
 }

if的第三种结构

if的第3种结构
 if(条件1)
 {
 	语句;
 }
 else if(条件2)
 {	
	语句;
 }
 else
 {	
	语句;
 }

if的第四种结构

if (条件)
 	语句1

if使用注意:

 1. 比较大小时,常量值放左边,变量放右边

 2. 注意赋值运算符,不要写成两个=

 3. if语句后面不要写;

 4. 如果要在if后面的语句中定义新的变量,必须用大括号{}


switch语句

switch (数值)
 {
    case 数值1:
        语句1;
        break;
    case 数值2:
        语句2;
        break;
 default :
        语句3;
        break;
 }

三种循环结构

while循环

while (条件)
 {  循环体
 }
例子 int i = 0;
while(i<10)
{ 
printf("例子");
i++;
} //输出10行

运行原理

 1.如果一开始条件就不成立,永远不会执行循环体

 2.如果条件成立,就会执行一次循环体,执行完毕,再次判断条件是否成立......

do……while

do {
 } while(条件);
例子int i = 0;
do{
printf("例子");
i++;
}while(i<10)//输出11行

whiledo-while的区别

 1.很多情况下,whiledo while可以互换

 2.while特点:如果一开始的条件不成立,永远不会执行循环体

 do while特点:不管一开始的条件是否成立,至少会执行一次循环体

 3.最好用while

for循环

for (语句1; 条件; 语句2)
 {  }
例子
for(int = 0;i<10;i++)
{
	printf("例子");
}

语句1:初始化语句

 语句2:增量语句(执行完循环体后再执行的语句)

for循环注意点

 不要随便在for()后面写分号

 如果要在循环体中定义新的变量,必须用大括号{}包住

 最简单的利用for循环实现死循环:for(;;);

break和continue的区别

break:直接结束整个while循环。注意点:只对最近的循环结构有效

 continue: 结束当前的循环体,进入下一次循环体的执行。注意点:只对最近的循环结构有效

sizeof运算符

sizeof是一种运算符不要想当然理解为函数

sizeof使用时可以不加()

sizeof可以加变量、常量、数据类型

跟数据类型是必须加()

常量区、堆区和栈区

可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。

静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

输出格式

%p 输出地址
%c 一个字符  %s 一个字符串,遇空格、制表符或换行符结束。 
%d 十进制整数 %ld长整型  %lld:longlongint %hd:shortint  %zd  unsigned long、
%i 十进制整数 %o 八进制形式输出整数   %x 十六进制形式输出整数  
%f,%F,%e,%E,%g,%G用来输入实数,可以用小数形式或指数形式输入。 
%u 读入一个无符号十进制整数%zd:无符号长整型unsignedlong

按位与,或,异或

按位与 &  都为1才为1

按位或 |  一个为1则为1

按位异或 ^

1.相同数值进行异或,结果肯定是0,比如9^9

2.交换 9^5^6 == 9^6^5

3.任何数值跟0进行异或,结果还是原来的数值,9^0 == 9

4.a^b^a == a^a^b == 0^b == b

变量的内存分析

 1.内存寻址由大到小,优先分配内存地址比较大的字节给变量

 2.变量越先定义,内存地址就越大

 3.取得变量的地址:&变量名

 4.输出地址:%p

 5.一个变量一定先进行初始化,才能使用

函数

1.什么情况下定义函数:添加一个常用的新功能

 2.函数的定义格式

 返回值类型  函数名(形式参数列表)

 {

  函数体

 }

void test()
{
printf("条用了test函数");
}
int max(int x,int y)
{
int z;
z = x>y?x:y;//三目运算符  条件 ? 数值1 : 数值2
return z;
}

定义函数的步骤

1> 根据函数的作用,起一个有意义的名称

2> 确定函数的形参个数

3> 确定函数的返回值

参数注意点

  1.形式参数:定义函数时函数名后面中的参数,简称形参

  2.实际参数:调用函数式传入的具体数据,简称实参

  3.实参个数必须等于形参个数

  4.函数体内部不能定义和形参一样的变量

  5.如果是基本数据类型作为函数形参,纯粹是值传递,修改函数内部形参的值,并不会影响外面实参的值

  6.一个函数可以没有形参,也可以有无限多个形参

函数注意点

 1.默认情况下,不允许有函数的名称一样

 2.函数不能嵌套定义

 3.函数不能重复定义,但是可以重复声明

 4.如果有函数的声明,没有函数的定义

  1  编译可以通过,因为编译器只会检测语法合不合理,并不会检测函数有没有定义

 2  链接报错,因为链接的时候会检测函数是否定义

指针

 格式:变量类型 *变量名;

 指针变量只能存储地址

 指针就一个作用:能够根据一个地址值,访问对应的存储空间

 指针变量p前面的int:指针变量p只能指向int类型的数据

注意,不建议的写法

 int *p只能指向int类型的数据

 int *p;
 double d = 10.0;
 p = &d;

指针变量只能存储地址

 int *p;
 p = 200;

指针变量未经过初始化,不要拿来间接访问其他存储空间

 int *p;
 printf("%d\n", *p);
1. 定义变量时的*仅仅是一个象征,没有其他特殊含义

2. 这个时候的*的作用:访问指向变量p指向的存储空间

3. 清空指针后,不能再间接访问其他存储空间

4. 任何指针都占用8个字节的存储空间

定义字符串的2种方式

1> 利用数组

char name[] = "itcast";

特点:字符串里面的字符是可以修改的

使用场合:字符串的内容需要经常修改

2> 利用指针

char *name = "itcast";

特点:字符串其实是一个常量字符串,里面的字符是不能修改

使用场合:字符串的内容不需要修改,而且这个字符串经常使用

利用上面知识完成的一个小程序

/*n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位*/
#include <stdiio.h>
int main()
{int i,k,m,n,num[50],*p;
printf("\ninput number of person:n = ");
scanf("%d",&n);
p = num
for(i = 0;i<n;i++)
	*(p+i) = i+1; // 以1至n为序给每个人排号
i = 0;k = 0;m = 0;
while(m<n-1) // 当退出人数比n-1少时执行循环体
  {
	if( *(p+i)!=0 ) k++;
	if( k==3 )
	{*( p+i )=0; // 对退出的人的编号置为0
	k=0;m++;}
	i++;
	if( i == n)i=0; // 报数到尾后。i恢复为0
  }
	while(*p == 0)p++;
	printf("The last one is NO.%d\n",*p);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值