#include “stdio.h“:在当前目录和系统指定的目录中找该文件。
#include <stdio.h> :在由系统指定的文件目录中找该文件。宏函数:
1 #include <stdio.h>
2 #define OUT printf("wddv587!\n") //无参数宏函数
3 #define P(s) printf("%s\n",s) //有参数宏函数
4 #define SQR(x) x*x //写宏函数多加括号
5
6 int main()
7 {
8 int a=1, b=2;
9 OUT;
10 P("wddv587666");
11 printf("%d\n",SQR(a+b));
12 return 0;
13 }
自定义函数与宏函数的区别:
函数 | 优点 | 缺点 |
宏定义函数 | 节省空间(形参) | 浪费时间(编译)没有语法检查,不安全 |
普通函数 | 有语法检查 | 浪费时间 |
1.指针
指针是变量的一种,里面是一个地址,通过这个地址找到要找的数据。
实质:单元的地址就是指针内容;
&是取地址的运算符,*是表示指针运算符:
所有类型的指针长度都是4字节;
例如:int a, *pa ;
pa = &a ; //把a的地址给pa,都是整型
把一个指针变量的值赋予相同类型的另一个指针变量;
Int a, *pa = &a, *pb ; pb = pa; // 把a的地址给pb;
*有两个含义:定义的时候:表示顶一个指针类型变量;
使用的时候 :表示取值。
【注】:
(*p1)++, *p1++区别?
(*p1)++是x的内容加1;
*p1++是先求*p1的值(x),然后再p1++,指向下一个元素,不再指向x;
利用指针运算实现库函数strcpy
源代码:
(当涉及到修改实参内存值的时候需要传地址)
1 #include <stdio.h>
2
3 char *mystrcpy(char *str, char *ptr)
4 {
5 char *p = str;
6 while(*ptr != '\0')
7 {
8 *str = *ptr;
9 str++;
10 ptr++;
11 }
12 *str = '\0';
13 return p;
14 }
15
16
17 int main()
18 {
19 char str[20]="helloworld";
20 char ptr[20]="world";
21
22 mystrcpy(str,ptr);
23
24 printf("%s\n",str);
25 return 0;
26 }
指针与NULL的比较
空指针是对指针变量赋予0值得到的:
#define NULL 0
int *p=NULL; 空指针
Int *p; 野指针
不同类型与零值比较:
1.int
if(n == 0)或者 if (n != 0)
2.float
const float EPSINON = 0.00001;
if ((n >= -EPSINON ) && (n <= EPSINON ))
3.bool类型
if (flag)或者if (!flag)
4.指针类型
if (n == NULL)或者if (n != NULL)
指针变量的使用步骤:
1. 定义指针变量;
2.给指针变量赋地址;
3.正常使用指针进行运算;
注意:
指针变量未赋值时,可以是任意值,是不能使用的,会造成意外错误。而指针变量给NULL值后,则是可以使用的,只是不指向具体的变量。
3.指针与数组
数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
输出数组的方法主要有下标法和指针法:
1 #include <stdio.h>
2
3 int main()
4 {
5 int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
6 int i, *p = a;
7 for (i = 0; i < 10; i++)
8 {
9 printf("%d ",a[i]);
10 //printf("%d ",*(a+i));
11 //printf("%d ",*(p+i));
12 }
13 printf("\n");
14
15 char *q = "helloworld";
16 for (i = 0; i < 10; i++)
17 {
18 printf("%c ",q[i]);
19 }
20 printf("\n");
21 return 0;
22
23 }
用指针引用数组元素
C语言规定:
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。
例:
P的初值为&a[0] :
p+i和a+i都是a[i]的地址。
*(p+i)和*(a+i)都是p+i和a+i所指向的数组元素,即a[i].
例如:
*(p+5), *(a+5)就是a[5].
指向数组的指针变量也可以带下标。p[i]和*(p+i)等价。
4.指针和字符串
在C语言中,存放字符串的方法:
1)用字符数组存放一个字符串,然后输出该字符串。
例如:char a[20]=”I love China!”;
2)用字符串指针指向一个字符串。
例如:char *s="C Language"; (或者分开赋值也行)则表示s是一个指向字符串的指针变量。
3)错误写法:char b[20] ; b="helloworld";
这里引出一个指针数组的概念:
1 #include <stdio.h>
2
3 int main()
4 {
5 char *string[] = {"I love CHINA","I am","wddv587"};
6 printf("%s\n",string[0]);
7 printf("%s\n",string[1]);
8 printf("%s\n",string[2]);
9 printf("%p\n",string[0]);
10 printf("%p\n",string[1]);
11 printf("%p\n",string[2]);
12 return 0;
13 }
指针数组里面的元素全是指针。