1. 指针加1
#include<stdio.h>
int main()
{
char ac[] = {5, 15, 34, 54, 14, 2, 52, 72};
char *p = ac;
int ai[] = {5, 15, 34, 54, 14, 2, 52, 72};
int *q = ai;
printf("%p \n",p);
printf("%p \n",p+1);// %p :地址(16进制)
printf("%p \n",*(p+1));
// * 为单目运算符,优先级 高于 + 小于 ()
// 同理也可用 ++ -- - += -= 符号操作
putchar('\n');
printf("%p \n",q);
printf("%p \n",q+1);
printf("%p \n",*(q+1));
printf("%d \n",sizeof(int));
printf("%d \n",sizeof(char));
//指针加1实际为地址加上 sizeof(类型),即 下一个数据单元
}
2.指针相减
#include<stdio.h>
int main()
{
char ac[] = {5, 15, 34, 54, 14, 2, 52, 72};
char *p = ac;char*p1=&ac[5];
int ai[] = {5, 15, 34, 54, 14, 2, 52, 72};
int *q = ai;int*q1=&ai[5];
printf("%p \n",p1-p);
//得到的值为 16进制地址之差除以 sizeof(类型),
//即 有几个 该类型的 元素
putchar('\n');
printf("%p \n",q1-q);
}
3. *p++
++ 运算符优先级是高于* 的 ,因此可以不用().
这里*p++表示先取*p对应的值 ,然后移到下一个 地址单元,再把移动后的位置赋值给*p
#include<stdio.h>
int main()
{
char ac[] = {5, 15, 34, 54, 14, 2, 52, 72,'\0'};
//加个标记结尾的字符 \0,为下文做判断
char *p = ac;
while(*p != '\0') printf("%d \n",*p++);
//遍历输出
}
4. 0 地址
每个程序都有自己的 0地址 . 是虚拟的 0地址 ,不是真实的物理 0地址.
这个地址通常不应该碰触,所以不应该用指针对 0地址 赋值,甚至不能去读取.
NULL为预定义表示0地址