宏
宏的作用:是在预编译前替换
宏名的命名规范:1.纯大写 或者 k+驼峰 命名法 ;2.对于有参宏,宏名与参数之间不能加空格,每个参数加小括号 3:参数大写,每一个参数都要加上括号
例如
# define COUNT 20
# define kRandom(A, B) arc4random( ) % (B - A + 1) + A
# define MUL(X, Y) (X)*(Y)
函数的声明和实现
(声明的时候参数名可以省略,只给对应形参的类型)
//传值
void changeOfNums(int ,int );
//函数定义(实现)
void changeOfNums(int x,int y ){
int temp =x;
x =y;
y =temp;
printf("%d %d \n",x,y);
}
//传地址
void changeOfPointer(int *,int *);
void changOfPointer(int *p1,int *p2){
int tem = *p1;
*p1 = *p2;
*p2 = tem;
}
指针在使用时必备条件:1.要有明确的指向,2.指向的内存空间必须是可控的。
COUNT;
int num = kRandom(20, 40);
printf ("%d\n", num);
int n = MUL (3 + 5,4);
printf("%d\n",n);
//错误写法1:
int*p = NULL;
printf("%d",*p);
//错误写法2:
int *p = 0x10010100;
*p = 10;
//正确地写法
int a =10;
int *p = NULL;
p = &a ;//&取址符
函数调用的两种传值方式:
1.传值:直接传递变量的数据。适用于在函数内部只想使用数据,并不想改变外部变量的数值场景
2.传址: 直接传递变量的地址。适用于在函数内部想修改外部变量的数值的场景
指针与字符串
// 双引号括起来的叫常量字符串,存储在常量区
char str [] = "rainy";// 将常量区的字符串拷贝到栈区数组str中,
char *p2 = str ;// P2指向的是栈区数组的首地址
//输出第一个字符
printf("%c\n",*p2);
strcpy(str, "sunny");//将str中的内容进行修改,因为str是在栈区,栈区内容可以修改
printf("%s\n",p2);
//打印其中字符y
printf("%c\n",*(p2+4) );
char *p4 = “rainy”;//p4指向的是常量区的字符串,无法修改
//p4 = str1;
printf(“%c\n”,*p4);
//输出整个字符串
printf(“%s\n”,p4+2);//%s 输出的原理: 给定一个开始地址,从开始地址一个一个字符的输出,知道遇到\0结束.
//strcpy(p4, "sunny"); //修改常量区的字符串的内容,常量区的内容不可改变,程序崩溃