#/预处理
1.种类:
宏定义 #define
文件包含 #include
条件编译
#include"stdio.h"
在当前目录和TC指定目录中找该文件。
#include<stdio.h>
在由TC指定文件目中找该文件。
#define OUT printf("hello") //无参宏函数
#define P(s) printf("%s\n",s)//有参宏函数
题:自定义函数和宏函数的区别?
1.宏函数
优点:会节省空间(形参的空间)
缺点:编译时会更耗时间,没有语法检查,不安 全
2.自定义函数
有点:有语法检查
缺点:会浪费空间
举例:
#define SQR(x) x*x //只做简单替换
int a=1,b=2;
SQR(a+b)
//解释:1+2*1+2=5
#define SQR(x) (x)*(x) //尽量增加括号
int a=1,b=2;
SQR(a+b)
//解释: (1+2)*(1+2)=9
#************************************************************指针******************************************************************#
#*指针
指针是变量的一种,里面是一个地址,通过这个地址找到要找的数据。
实质:单元的地址就是指针内容。
#所有类型的指针长度都是4个字节。因为地址就是32位。
#*指针运算符
&是取地址运算符,*是表示指针运算符
举例
int *p1,a;
p1=&a;
*p1=3;
int a=1;
int *p= &a
//p是指针,用来保存地址0x100
//a=100; 通过变量名来访问内存
//*p = 100; 通过地址来访问内存
关于 ‘*’
含义1:
定义的时候,表示后面的变量是一个指针。
含义2:
使用的时候,表示取值。取地址开头的内存里的值。
char a;
char *p = &a; //p指向a,p+1 加1个字节。
int b;
int *q = &b; //q指向b, q+1 加4个字节
int i=1;
(*p1)++,*p1++的区别
//解释:(*p1)++只是内容加一;
// *p1++先执行*p1,再把p1(地址)+1:
#指针和NULL的比较
#define NULL 0
int *p = NULL;//空指针
int *p; //野指针
//p为指针变量,p=NULL表示空指针,不指向任何变量。
//
int
if( n==0) or if ( n!=0)
float
const float EPSINON = 0.00001;
if((n >= -EPSINON)&&(n<= EPSINON)
//指针类型
if( n == NULL ) or if( n != NULL )
#指针变量的使用步骤
1.定义指针变量;
2.给指针变量赋地址;
3.正常使用指针的值;
#函数 malloc(): //向操作系统申请空间(连续堆空间)(单位是字节)
习惯于这样书写: malloc(sizeof(char) * 10);
包含于头文件: include<stdlib.h>
//eg1:
....
char *fp;
fp = (char*)malloc(sizeof(char) * 30);
if(NULL == fp)
{
printf("malloc falure!\n");
}
strcpy(fp,"helloworld!");
printf("%s\n",fp);
free(fp); //释放空间。
.......
//eg2:
......
void string_reverse(char *ptr,char *str)
{
}
int main()
{
char *ptr = "helloworld!";//ptr指向helloworld!字符串 helloworld是常量,不能修改
char *str = (char*)malloc(sizeof(char)*64);
string_reverse(ptr,str);
printf("%s\n,str);
return 0;
}
#思考题
int a[5] = {1,2,3,4,5};
int *p1 = (int*)(&a+1);
int *p2 = (int*)((int)a+1);
int *p3 = (int*)(a+1);
//p1[0],p2[0],p3[0]的值分别为多少?
//答:p1[0] = 随机值
// p2[0] = 随机值
// p3[0] = 2
#字符串的赋值方法
char *ptr = "helloworld";//ptr指向helloworld字符串。
char *str;
str = "helloworld";//同上
char a[20] = "helloworld";//数组a保存helloworld字符串。
char b[20];
//b = "helloworld";//错误 b数组名是常指针
strcpy(b,"helloworld");//正确
#指针法和下标法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,10};
int *p = a;
int i;
for(i=0;i<10;i++)
{
// printf("%d",a[i]);
// printf("%d",*(p+i));
printf("%d ",*(a+i));
}
printf("\n");
char *q="helloworld!";
printf("%s\n",q);
int j;
for(j=0;j<11;j++)
printf("%c",q[j]);
printf("\n");
return 0;
}