指针运算(自己做个笔记)

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]

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值