11.28.2016
1.strcmp(a,b):比较a,b字符串,如果a=b,返回“0”;
如果a>b,返回正直;a<b,返回负值
2.当函数返回指针需要返回NULL时(也就是函数可能出现无法找到那个指针时),需要加入#include<stdio.h>头文件(这个函数为一个单独的.c文件时)
格式化输入输出
●int main()
{
printf(“dsaff”);
while(1);
return0; //死循环,这样无法输出结果
}
1.printf();为行缓冲,也就是这一行数据填满才能输出(之所以去掉while可以输出,是因为程序结束需要清除缓存)
2.printf(“dsd\n”);换行必定可以输出
3. printf();后面加scanf();函数也可以输出,因为scanf函数与printf共用同一个缓冲区,所以要先清理prinf的缓冲内容
应用:添加printf函数调试信息时,加入放在函数首行测试函数是否执行,可能导致printf没有输出,造成误判,所以养成printf结尾加\n的习惯
指针与数组
●地址的步长:地址加1,即跳一个步长,这个步长取决于变量的数据类型,int跳4个字节
e.g. int a; printf(“%p”,&a+1);
* 名称:间接运算符或取值运算符
取值运算符:取指针变量对应空间保存的地址对应的内存空间的值
也就是说取p保存的地址(也就是int a的地址),然后再取出这个地址指向的变量(a)保存的内容
自增:
1.num++:对num对应的内存空间的值自加1(num为int)
2.p++: 对p对应(即保存)的内存空间的值自加1步长(p为int *)
3.(*p)++:对p指向的内存空间的值加1(如果指向num,就是num保存内容自增,等同于num++)
区分:指针p对应的空间与指向的空间:
对应的:即变量保存的内容;
指向的:即指针保存地址的那个变量内保存的值,这样就解释了为什么
&num==p==*pp==*PPP
p保存num的地址,
多维指针:
int num=5; 0x1000
int *p=# 0x2000 //一维指针,p保存num地址
int **pp=&p; 0x3000 //二维指针,pp保存p的地址
int***ppp=&pp; 0x4000 //三维指针,ppp保存pp的地址
num==*p==**pp==***ppp=5
&num==p==*pp==**ppp=0x1000
&p==pp==*ppp=0x2000
&pp==ppp=0x3000
&ppp=0x4000
程序代码见:程序->“理解num,p,pp,ppp指针.c”
字符指针:
1.数组遍历(ptr的地址一直在变) 2. 数组遍历(ptr的地址一直不变)
while(*ptr!=’\0’) for(i=0;*(ptr+i)!=’0’;i++)
{ ptr++; {
} }