c语言指针运算
1.指针加1
指针加1表示 指针所指向的地址+sizeof(指针所指数据类型) 的地址
因此,如果将一个数组a的首地址赋值给一个指针p,*(p+n)和a[n]是等价的
指针除了+外,还可以++、--、+=、-=、-
2.指针与指针相减
int p=&a[0];
int q=&a[6];
q-p // 6 指针与指针相减的结果是其地址相减/sizeof(指针所指向的数据类型)
3. *p++
++和*都是单目运算符,但是++的优先级比*高
*p++表示取p所指的变量的内容之后,将指针+1
4.指针比较
<、<=、>、>=、!=、==都可以对指针做比较
指针大小的比较实质是地址大小的比较
5.NULL地址
NULL表示一个预定义的符号,表示0地址
在程序加载到内存中的时候,有一个逻辑0地址,这个地址是不能被使用甚至不能被读取的,因此可以用0地址/NULL表示空的指针,因而一旦使用空指针,系统会报错
推荐使用NULL而不是0,因为有的编译器不愿意你用0来表示0地址
6.指针的类型
无论指向什么类型的指针,所有指针变量所占据的内存的大小都是一样的(我的64位机上占8个字节),但是指向不同类型的指针之间不能互相赋值,假如将char类型指针q赋值给int类型指针q赋值成功,那么*p=0将使连续的四个内存单元的内容变成0,这显然是不合适的。
7.指针的类型转换
最常用的是void*类型指针转换成其他类型
如:
int b=3;
int * a=(int*)malloc(sizeof(b));
8.动态内存分配
C99之前
int number;
scanf("%d",&number);
int *p=(int*)malloc(number*sizeof(int));
p用完之后记得free(p),假如malloc申请失败,则返回NULL
C99之后
int number;
scanf("%d",&number);
int p[number];
9.free函数
malloc内存用完之后记得一定一定要free()
int *p=(int*)malloc(1*sizeof(int));
free(p) //OK
int *p=(int*)malloc(1*sizeof(int));
p++;
free(p) //Error free只能释放申请的首地址,因此释放的时候不能释放改变后的地址
int *p=NULL;
free(NULL); //OK