指针知识点

指针知识点

1.内存可以分为大量内存单元,一个内存单元大小为8个比特位,每个内存单元都有一个编号,这个编号就是指针。(一栋大房子,有很多房间,每个房间可以住8个人,房间编号就是指针,也是地址)
只有嵌入式的地址是实际物理空间,其余是假象的

2 取地址操作符
& 用于取出字符地址
#include<stdio.h>
int main()
{ int a=10;
&a;
printf (“%p\n”,&a);
return 0;
}

3 指针变量
用于存放地址的一种变量
例:int *pa=&a;
这个就是把a的地址存放到pa中
这也是用&a给pa初始化
(&a是读出的地址)

全部变量(int &pa)
int main()
{ int a=0;
int &pa=NULL;
retur 0;
}
此时相当于pa没有存放地址,可以之后再存

但是:如果是局部变量,&a在一个小函数内,
此时int &pa是一个未知数,也叫做野函数,不可以强行使用

4 理解指针类型
int a=10;
int *pa=&a;
这里**说明pa对应·指针变量,但int对应的是pa的类型,总说是一个整型的地址

5 解引用操作符
#include<stdio.h>
int main()
{ int a=10;
int *pa=&a;
pa=0;
return 0;
}
这里
pa是通过pa中存放的地址,找到a,将a赋值为10(找到门牌号,然后客人)

6 指针的大小
例 printf(“%zd\n”,sizeof(int*))
1字节=8比特
32平台下地址是32比特,4字节
64平台下地址是64比特,8字节
指针变量的大小只与平台有关

指针解引用
例: int *pi=&a;
*pi=0;

char *pi=(char)&a; *pi=0;

前者可以把4个字节改为0,但后者只可以改一个,这是不同类型对解引用符的作用权限。

总结一下:
指针变量的大小只与平台有关
指针对解引用操作符的权限与指针类型有关

7.指针加减整数
指针类型决定了指针向前或向后的距离
但指针必须跨越与自己同类型的距离

char*+1 向前走1个长度
int*+1向前走4个长度

8.void指针
专门用于接收不同类型的地址
void
pa=10;
viod*pc=10;

pc和pa

9.指针加减指针
指针加减指针=整数
指针加减整数=指针
F2897-2=F2895
指针加减指针的结果绝对值是指针间元素的个数
(必须在同一个内存)
#include<stdio.h>
int main()
{int arr[5]={1,2,3,4,5}
printf(“%d\n,”&arr[4]-&arr[2])
return 0;
}
这里&arr[4]-&arr[2]便是指针加减指针

10.指针的大小
本质:一个数值
用数组举例

先明确一个点:p这个存的·是地址
*p这个即使指针符号,也是解引用,取数组里的数

#include<stdio.h>
int main()
{int arr[5]={1,2,3,4,5};
int *p=&arr;
int sz=sizeof(arr)/sizeof(arr[0]);
while(p<=&arr[sz]) 这个地方就是用·了·指针的比较
{printf(“%d\n”,*p);
p++;
}
return 0;
}

11.传值调用和传址调用
前者相当与给复印件,不给原稿
但后者相当于直接给原稿
前者实参不改变形参,改不了原值
但后者可以给实参

传值调用
void eaxple(int x,int y)
{int tmp=x; \这里已经定义了x是int,一个变量只能定义一次
x=y;
y=tmp;\左边是变量,右边是赋值量,int tmp已知,为赋值量
}
这种情况无返回值

传址调用
#include<stdio.h>
void eaxple(int x,int y)
{int *tmp=& x;
&x=&y;
&y=*tmp;
}
这样才打开房门,把数值传过去

一个是把门牌改变,里面数值不变
一个是打开房门,改数值
后者才可以建立函数与主函数的关系

12.二级指着
用来存放一级指针的指针变量
**ppa用来存放pa的指针变量,访问pa