1,指针+1 地址变化
#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(指针类型)
2,指针+1 值变化
#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]
3,指针可进行算术运算
- 加减一个整数
- ++ --
- 指针相减
(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(指针类型)
4,*p++
- * 优先级没有 ++ 高
- 取出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
5,指针比较
- 实际上是内存地址大小比较
- < > >= <= == !=
6,0地址
内存有0地址,不能随便碰
NULL <----> 0地址
7,指针特点
- 不同类型指针,大小一样
- 不同类型指针,不能相互赋值
#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* 指针 不知道指向什么的指针
8,PTA
(1)语句int *p; *p = 50;
执行时,不会有任何错误。(X)
没有先给指针P初始化,就使用指针
(2)
以下选项中,对基本类型相同的指针变量不能进行运算的运算符是 (D)。
A.-
B.=
C.==
D.+
两个地址相加无意义,且可能越界。
地址越界:100KB的内存用于你的数据存储或者程序运行,但是这个时候你却暂用了大于100KB的内存,这样就越界了,多出来的部分,系统并不知道怎么去解析或者动态给你分配,所以出于对程序和系统的保护,用一种和谐的方式告诉你内存越界了或者通用内存访问错误
(3)执行语句int *p = 1000;
后,指针变量p
指向地址为1000
的变量。(X)
报错
#include <stdio.h>
int main(){
int *p=1000;
return 0;
}
[Error] invalid conversion from 'int' to 'int*' [-fpermissive]