指针知识点1

一、int *P是啥?

  1. int * 代表指针变量类型 ,p是 变量名。
  2. 如果
   int i=3;
   i = &p;
   
  // 那么
  
   i = *p; //value = 3

二、 指针和指针变量

  1. 指针就是地址,地址是指针
  2. 地址就是内存单元的编号:
    ##特点
    1.编号从0开始的非负整数;
    2.以32位操作系统为例子:
    ###内存为4G(4 G = 232 B = 230 * 22 B)
  3. 指针变量是存放地址的变量
  4. 指针指针变量是两个不同的概念
    1 .指针本质是一个操作受限的非负整数
    2 .指针只能进行运算
    要注意:通常我们叙述时会把指变量简称为指针,实际它们含义并不同
ps:内存换算

  1 K ( K B )   =   2 10 B ( 字 节 )     1 M   =   2 10 K B   =   2 20 B     1 G   =   1024 M   =   2 30 B   \ 1 K (KB) \ = \ 2^{10} B(字节) \,\\ \ 1 M \ = \ 2^{10} KB \ = \ 2^{20} B\,\\ \ 1 G \ = \ 1024 M \ = \ 2^{30} B\,  1K(KB) = 210B() 1M = 210KB = 220B 1G = 1024M = 230B

*p和p的区别:
#include<stdio.h>

int main(void){
	int *p;
	int i = 5;
	p = &i;
	
	printf("%d, %d",p, *p);
	
	return 0;
} 

输出结果

  • 结论:
    如果p是个指针变量,并且p存放了普通变量i的地址则p指向了普通变量i
    *p就完全等同于i
    或者说:
    在所有出现*p的地方都可以替换成i;在所有出现i的地方都可以替换成*p
    *p就是以p的内容为地址的变量

三、指针常见使用错误

  • 例1:
#include<stdio.h>

int main(void){
	int *p;
	int i = 5;
	
	*p = i;//error
	
	printf("%d", *p);
	
	return 0;
} 
例1错误分析:p没取i的地址(p = &i),p没有初始化。
              或者说:程序只分配了两个内存,*p = i 用到了第三个内存
  • 例2:
#include<stdio.h>

int main(void){
	int *p;
	int *q;
	int i = 5;
	
	p = &i;
	*q = p;//error
	
	printf("%d",*q);
	
	return 0;
} 
例2错误原因:(*q = p) p是地址,*q是变量

-例3

#include<stdio.h>

int main(void){
	int *p;
	int *q;
	int i = 5;
	
	p = &i;
	*q = *p;//error
	
	printf("%d",*q);
	
	return 0;
} 
例3错误原因:(*q = *p) q没有赋值

-例4

#include<stdio.h>

int main(void){
	int *p;
	int *q;
	int i = 5;
	
	p = &i;
	p = q;//error,q是垃圾值,q传给了p,p也成了垃圾值
	
	printf("%d",*q);
	
	return 0;
} 
例4错误原因:[printf("%d",*q)] q的空间是属于本程序的,所以本程序可以读写q的内容,但是如果q内部是垃圾值,则本程序不能读写*q的内容,因为此时 *q所代表的内存单元的控制权限并没有分配给本程序

经典的指针程序:互换两数字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值