5_预备知识_指针_2
指针的重要性:
指针是C语言的灵魂
定义:
地址:
地址是内存单元的编号,从0开始的非负整数,范围:0-FFFFFFFF【0-4G-1】
CPU=====地址线,控制线,数据线=====内存
指针:
指针就是地址,地址就是指针。
指针变量是存放内存单元地址的变量。
指针的本质是一个操作受限的非负整数。
分类:
1.基本类型的指针
2.指针和数组的关系
变量并不一定连续分配,随机分配内存。
内存:
内存是多字节组成的线性一维存储空间。
内存的基本划分单位是字节。
每个字节含有8位,每一位存放1个0或1个1.
内存和编号是一一对应的。
软件在运行前需要向操作系统申请存储空间。在软件运行期间,该软件所占空间不再分配给其他软件。当软件运行完毕后,操作系统将回收该内存空间(操作系统并不清空该内存空间中遗留下来的数据)。
NOTE:1)指针变量也是变量,普通变量前不能加*,常亮和表达式前不能加&。
2)局部变量只在本函数内部使用。
如何通过被调函数修改主调函数中普通变量的值。
1)实参为相关变量的地址;
2)形参为以该变量的类型为类型的指针变量;
3)在被调函数中通过 *形参变量名的形式 的形式就可以修改主函数。
CASE 1
#include<stdio.h>
int main(void)
{
int*p; //p是个变量名字,int*表示该p变量只能存储int类型变量的地址
inti=10;
intj;
// j=*p;
// printf("%d\n",j); //error,p未指定
// charch='A';
// p=&ch; //error,类型不一致
p=&i; //p保存i的地址,p指向i;修改p的值不影响i的值,修改i的值不影响p的值;任何场合下,*p和i可以互换。*p等价于i。
//p=10; //error
j=*p;//等价于j=i;
printf("i=%d,j=%d,*p=%d\n",i,j,*p);
return0;
}
CASE 2
#include<stdio.h>
void f(int * i)//不是定义了一个名字叫做*i的形参,而是定义了一个形参,该形参名字叫做i,它的类型是int*
{
*i=100;
}
int main(void)
{
inti=9;
f(&i); //局部变量只在本函数内部使用。
printf("i=%d\n",i);
}
指针和数字
数组名:一维数组名是个指针变量,它存放的是一维数组第一个元素的地址,它的值不能被改变,一维数组名指向的是数组的第一个元素。
CASE 1
a[3]==*(3+a); 3[a] ==*(a+3)==*(3+a);
int a[5]={1,2,3,4,5};
Show_Aarry(a,5);//a等价于&a[0],&a[0]本身就是int*类型
void Show_Array(int * p,int len)
{
IntI;
//P[2]=-1;// p[0]=*p ; p[2]==*(p+2)==*(a+2)==a[2] ; p[i]就是主函数的a[i]
for (i=0;i<lem;i++)
printf(“%d\n”,p[i]);
}
指针变量的运算
指针变量不能相加,不能相乘,不能相除。
如果两指针变量属于同一数组,则可以相减。
指针变量可以加减一整数,前提是最终结果不能超过指针变量
p+i的值是p+i*(p所指向的变量所占的字节数)
p-i的值是p-i*(p所指向的变量所占的字节数)
p++<==>p+1 p--<==>P-1