指针笔记
一、int *P是啥?
- int * 代表指针变量类型 ,p是 变量名。
- 如果
int i=3;
i = &p;
// 那么
i = *p; //value = 3
二、 指针和指针变量
- 指针就是地址,地址是指针
- 地址就是内存单元的编号:
##特点
:
1.编号从0开始的非负整数;
2.以32位操作系统为例子:
###内存为4G
(4 G = 232 B = 230 * 22 B) - 指针变量是存放地址的变量
- 指针和指针变量是两个不同的概念
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;
}