18.7.25记录

#/预处理
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;
}

猜你喜欢

转载自blog.csdn.net/qq_41481342/article/details/81208093