版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
2019.09.28指针和数组
2019.09.28
指针
指针的重要性 指针是c语言的灵魂
定义 地址 内存单元的编号(从0开始的非负整数 ,范围:0---pppppppp {0-4g01})
指针就是地址 地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
结构体
动态内存的分配和释放
EG
#include <stido.hz>
int main (void)
{
int *p; //p是一个变量名字,int*表示该p变量只能存储int类型变量的地址
int i=10;
int j;
p=&i //将i的地址发送给p,p指向i,*p代表i
j=*p //等价于j=i
//*p最终指向一个不确定的变量,因为p没有一个确定的整形变量所以是一个垃圾值
printf("i=%d,j=%d,*p=%d/n", i, j ,*p);
return 0;
}
常量和表达式前不能加&
如何通过被调函数修改主调函数中普通变量的值
1,实参为相关变量的地址
2,形参以该变量的类型为类型的指针变量
3,在被调函数中通过 *形参变量名 的方式就可以修改主调函数中的普通函数的值
指针和数组
指针和一维数组
数组名
一维数组名是个指针常量
它4存放的是一维数组第一个元素的地址,它的值不能被改变
一维数组名指向的是数组的第一个元素
下标和指针的关系
a[i]<<==>> *(a+i)
假设指针变量的名字为p
则p+i的值是p+i*(p所指向的变量所占的字节数)
指针变量的运算
指针变量不能相加,不能相乘,不能相除
如果两指针变量属于同一数组,则可以相减
指针变量可以加减一整数,前提是最终结果不能超过指针变量的值
p+i的值是p+i*(p所指向的变量所占字节数)
p-i的值是p-i*(p所指向的变量所占的字节数)
p++ <==> p+1
p-- <==> p-1
举例
如何通过被调用函数修改主调函数中一维数组的内容
两个参数
存放数组首元素的指针变量
存放数组元素长度的整形变量
#include<stido.h>
void f (int *i) //不是定义了一个名字叫*i的形参,而是定义了一个形参名字叫i类型是int* 能存放整形变量地址
{
i=100;
}
int main (void)
{
int i=9;
f (i);
printf(“i=%d\n",i);
return 0;
}
#include <stdio.h>
int main (void)
{
int a[5]={1,2,3,4,5}; //a只存放一个函数地址 指向第一个 指向a[0]
printf ("%p\n",a+1);
printf ("%p\n",a+2);
printf ("%p\n",a+3);
printf ("%p\n",a+4); //*a+3<==>a[0]+3
return 0;
}
【1】#include <stdio.h>
void show_Array(int *p,int len)
{
p[0]=-1 //p[o]=*p p[2]=*(p=2)=*(a=2)=a[2]
//p[i]就是主函数的a[i]
}
int main (void)
{
int a[5]={1,2,3,4,5};
show_Array (a,5), //a等价于&a[0] &a[0]本质是int*类型
printf("%d\n",a[2]);
return 0;
}
【2】#include <stdio.h>
void show_Array(int *p,int len)
{
int i=0;
for(i=0;i<len;++i);
}
int main (void)
{
int a[5]={1,2,3,4,5};
show_Array(a,5);
return 0
}