数据结构=个体+个体关系
算法=对存储数据的操作
算法:解题的方法和步骤
衡量算法的标准:
1.时间复杂度(大概程序要执行的次数,而非执行的时间)
2.空间复杂度(算法执行过程中大概所占用的最大内存)
3.难易程度
4.健壮性
指针:地址
地址:内存单元的编号
指针变量:存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
int *p;
//p是个变量名字,int * 表示该变量p只能存储int类型变量的地址
1.p保存i的值,p就指向i
2.修改p的值不影响i,修改i的值不影响p
3.*p就代表i
int j,*p;如果不写p=&i,
j=*p就代表一个不确定的单元,不能这么写
#include<stdio.h>
int main()
{
int *p,i;
i=10;
p=&i;
printf("%d %p",*p,p);
}
输出结果为10 0060FEF8
第一个值*p=i=10;
第二个值p在我的电脑上的存的i的地址
1.如果一个指针变量(假定为P)存放了某个普遍变量(假定为i)的地址,那我们就可以说“p指向i”,但p与i是两个不同的变量
2.修改p的值不影响i,修改i的值不影响p
3.*p等价于i,或者说 [*p]可以与i在任何地方互换
4.如果一个指针变量指向一个普通变量,则*指针变量就完全等价于该普通变量
注意:
1.指针变量也是变量,只不过他存放的只能是内存单元的地址,不能是内存单元的内容
2.普通变量前不能加*
3.常量和表达式不能加 &
#include<stdio.h>
void f(int i)
{
i=100;
}
int main()
{
int i=9;
f(i);
printf("%d",i);
}
输出结果为9
so 如何通过被调函数修改主调函数中普通变量的值呢
#include<stdio.h>
void f(int *p) //第二步
{
*p=100; //第三步
}
int main()
{
int i=9;
f(&i); //第一步
printf("%d",i);
}
输出结果为 100
so way:
第一步:实参为相关变量的地址
第二步:形参为以该变量的类型为类型的指针变量
第三步:在被调函数中通过 *形参变量名 的方式可以修改主调函数
中的普通变量的值
指针和一维数组
一维数组名是个指针变量,它存放的是第一个元素的地址,它的值不能改变;
a[i]<==>*(a+i)
假设指针变量的名字为p
则p+i的值是p+i *
指针 变量的运算:
1.指针变量不能相加,不能相乘,不能相除
2.如果量指针变量属于同一数组,则可以相减
3.指针变量可以加减一整数,前提是结果不能超过指针
*(a+3)等价于a[0]+3
#include<stdio.h>
void show(int *p,int n)
{
p[0]=-1;//p[0]=*p; p[i]就是主函数的a[i],p[2]==*(p+2)==*(a+2)
}
int main()
{
int a[5]={1,2,3,4,5};
show(a,5); //a等价于取地址a[0],&a[0]本身就是 int *类型
printf("%d\n",a[0]);
}
输出结果为 -1
so如何通过被调函数修改主调函数的中一维数组的值?
方法:
1.存放数组首元素的指针变量
2.存放数组元素长度的整形变量
#include<stdio.h>
{
double *p;
double x=66.6;
p=&x;//x占8个字节,1个字节一个地址
double arr[3]={1.1,2.2,3.3};
double *q;
q=&arr[0];
printf("%p\n",q);
q=&arr[1];
printf("%p\n",q);
q=&arr[2];
printf("%p\n",q);
}
输出结果:
0060FED8
0060FEE0
0060FEE8
地址之间差8