#include <stdio.h> int main(){ int a[]={0,1,2,3,4,5,6}; int *p=a; int *p1=p+1; printf("p = %p\n",p); printf("p1 = %p",p1); return 0; } 输出: p = 000000000062FDF0 p1 = 000000000062FDF4
相差4个字节,也就是 指针+1==指针内存地址+sizeof(指针类型)
#include <stdio.h> int main(){ int a[]={0,1,2,3,4,5,6}; int *p=a; int *p1=p+1; printf("p = %d\n",*p); printf("p1 = %d",*p1); return 0; } 指针: p = 0 p1 = 1
给指针加一,表示要让指针指向下一个变量
*p --->a[0]
*(p+1) --->a[1]
- 加减一个整数
- ++ --
- 指针相减
#include <stdio.h> int main(){ int a[]={0,1,2,3,4,5,6}; int *p=a; int *p1=&a[2]; printf("p = %p\n",p); printf("p1 = %p\n",p1); printf("相差 = %p",p1-p); return 0; } 输出: p = 000000000062FDF0 p1 = 000000000062FDF8 相差 = 0000000000000002
竟然不是8,而是4.说明指针相减结果不是地址差,而是 地址差/sizeof(指针类型)
- * 优先级没有 ++ 高
- 取出p所指的数据,顺便把P移到下一个位置
#include <stdio.h> int main(){ int a[]={0,1,2,3,4,5,6,-1}; int *p=a; while(*p!=-1){ printf("%d ",*p++); } return 0; } 输出: 0 1 2 3 4 5 6
- 实际上是内存地址大小比较
- < > >= <= == !=
内存有0地址,不能随便碰
NULL <----> 0地址
- 不同类型指针,大小一样
- 不同类型指针,不能相互赋值
#include <stdio.h> int main(){ int a[]={0,1,2,3,4,5,6,-1}; int *p=a; double *k; k=p; return 0; } [Error] cannot convert 'int*' to 'double*' in assignment
void* 指针 不知道指向什么的指针