一、指针的定义:
指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(Pointed to)存在电脑存储器中另一个地方的值。
简单的说:指针是一个变量,且这个变量是专门用来存放地址的。
指针虽然也表示一个编号,也是一个地址。但两者性质却不相同。一个代表了常量,另一个则是变量。就好比内存是一把尺子,而指针就是尺子上面的游标,可以左右移动,他某一个时刻是指向一个地方的,这就是指针变量。
指针和数组结合:
对于指向首地址的指针 p,p+i(或a+i)就是数组元素 a[i]的地址,*(p+i)( 或*(a+i) )就是 a[i]的值。
如果指针变量 p 已指向数组中的某一个元素,则 p+1 指向同一数组中的下一个元素。
引入指针变量后,就可以用以下两种方法来访问数组元素:
(1)下标法,即用 a[i]形式访问数组元素。
(2)指针法,即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中 a 是数组名,p 是 指向数组的指针变量,其初值 p=a。
二、结构体指针
一个结构体变量的指针就是该结构体变量所占据内存段的起始地址。
可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。
同时指针变量也可以用来指向结构体数组中的元素。
结构体指针变量说明的一般形式为:
struct 结构名 *结构指针变量名,如果要说明一个指向stu的指针变量pstu,可写为
struct stu *pstu;
三、宏定义
宏常量
我们最常使用到的#define的用法就是用#define来定义一个符号常量,而要修改时,只需修改#define这条语句就行了,不必每处代码都修改,例:
使用ifndef防止头文件被重复包含和编译
这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。 C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。
#ifndef x //先测试x是否被宏定义过
#define x //如果没有宏定义下面就宏定义x并编译下面的语句
...
...
...
#endif //如果已经定义了则编译#endif后面的语句
①换行符 "\"
#include"stdio.h"
#define Print printf("这是第1条语句\n");\
printf("这是第2条语句\n");\
printf("这是第3条语句\n")
②字符串化符 "#"
#include"stdio.h"
#define Print(str)\
{\
printf(#str"的值是%d",str);\
}
int main()
{
int x=3,y=4;
Print(x+y); //此处等价于printf("x+y""的值是%d",x+y);
//#str等价于"x+y",所以#str不需要再用双引号引起来
return 0;
}
③片段连接符"##"
#include"stdio.h"
#define Add(n,value)\
{\
num##n+=value;\
}
int main()
{
int num1=1;
int num2=10;
Add(2,10); //等价于num2+=10; 这里把num和2连接成了num2
printf(" num1=%d\n num2=%d",num1,num2);
return 0;
}