-
*(p+1)中“+1”指的是加上sizeof(*p),“-1”是相同的道理。
#include <stdio.h>
int main()
{
//char类型的数组
char a[]={0,1,2,3,4,5,6,7,8,9};
char *p=a;
printf("sizeof(*p)=%d\n",sizeof(*p));
printf("p=%p\n",p);
printf("p+1=%p\n",p+1);
//int类型的数组
int b[]={0,1,2,3,4,5,6,7,8,9};
int *q=b;
printf("sizeof(*q)=%d\n",sizeof(*q));
printf("q=%p\n",q);
printf("q+1=%p\n",q+1);
return 0;
}
-
两个指针相减的结果是【(两个指针的地址差)/sizeof(*p)】。
#include <stdio.h>
int main()
{
char a[]={0,1,2,3,4,5,6,7,8,9};
char *p=a;
char *p1=&a[5];
printf("p1-p=%d\n",p1-p);
int b[]={0,1,2,3,4,5,6,7,8,9};
int *q=b;
int *q1=&b[6];
printf("q1-q=%d\n",q1-q);
return 0;
}
-
*p++
- 取出p所指的那个数据来,完事之后顺便把p移到下一个位置
- ++运算符的优先级高于*运算符
- 通常用于数组类的连续空间操作
#include <stdio.h>
int main()
{
char a[]={0,1,2,3,4,5,6,7,8,9,-1};
char *p=a;
//遍历数组a
while(*p!=-1)
{
printf("%d\n",*p++);
}
return 0;
}
- 指向不同类型的指针不能相互赋值
- void* 指的是不知道指向什么东西的指针
- 指针也可以转换类型
- int *p=&i;void *q=(void *)p;
- 这并没有改变p所指向的变量的类型,而是让后人用不同的眼光通过p看它所指的变量
几道小测试题,第一遍写的时候都没有写对
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p;
while (1)
{
p =(char *)malloc(1);
*p = 0;
}
return 0;
}
最后程序会因为向0地址写入而退出。
原因:当没有内存可以malloc给你的时候,malloc返回0。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[] = {1,2,3,4,5,};
int *p = a;
int *q = &a[5];
printf("%d", q-p);
return 0;
}
结果输出为5。