计算机基础:
1、组成:CPU,存储,I/O
2、CPU:执行指令。
3、程序:就是有限指令的集合(外存中)
进程:正在运行的程序(CPU会通过文件系统去将外存中的程序加载到内存并分配空间)
存储单元:
1最小的存储单元:bit (存放0/1)
2计算机的存储基本单元:byte (每次一次性取出的宽度)
3其他单位: KB=1024Byte=2^10Byte
1MB=1024KB=2^10KB=2^20Byte=2^23bit
1GB=1024MB=2^10MB
注:8GB=1024*8MB=2^13MB=2^23KB=2^33Byte
4、物理地址:内存条上连续的编号
5、指针:就是地址
6、变量:
整型变量: int a=3 整型变量:专门存放整型的值
指针变量: 指针变量:专门存放指针的变量
定义: 类型* 变量名;
引用指针变量:引用内容 (注:引用指针内容的长度取决于指针的类型)
注:所有指针变量都为4Byte
7、通过指针修改空间的内容: *pb=100;
9、空指针: null
8、(***)指针的运算: + - 注:指针指向的元素地址
int* pa;
pa+n==pa+sizeof(int)*n ;指针是指向的元素的地址,p+n代表是向后移动4个元素
pa-n==pa-sizeof(int)*n ;指针是指向的元素的地址,p+n代表是向前移动4个元素
9、数组与指针:
9.1指针与数组的关系:
定义数组:类型 数组名[长度]
概念:连续且同类型的存储空间
数组名:就是此数组空间的首地址
9.2指针变量与数组的关系:
运算符:
1、取变量地址: &变量
2、引用地址的内容: *指针
#include<stdio.h>
void main()
{
//定义普通变量:分配空间
int a=100;
printf("sizeof(a)=%d ,&a=0x%x\n",sizeof(a),&a);
//引用变量:取出变量的内容 (1、作用域 2、生命周期)
printf("a=%d\n",a);
//定义指针变量:专门用于存放指针的变量 (分配空间)
int* pa=&a;
printf("sizeof(pa)=%d , &pa=0x%x\n",sizeof(pa),&pa);
//引用变量:引用变量的内容
printf("pa=%x &a=%x *(&a)=%d *pa=%d\n",pa,&a,*(&a),*pa);
}
short指针指向int的变量
#include<stdio.h>
void main()
{
//定义普通变量:
int a=65537; //为什么需要类型:分配 4Byte
short b=257; //2Byte
//定义指针变量:分配空间(专门用于存放地址) 类型* 变量名;
int* pa=&a;
printf("sizeof(pa)=%d\n",sizeof(pa));
short* pb=&b;
printf("sizeof(pb)=%d\n",sizeof(pb));
//引用内容: a
printf("a=%d,&a=0x%x,pa=0x%x,*pa=%d\n",a,&a,pa,*(pa));
printf("b=%d,&b=0x%x,pb=0x%x,*pb=%d\n",b,&b,pb,*pb);
//定义short指针指向int的变量
short* pc=&a; //pc的空间4Byte
printf("*pa=%d\n",*pa); //*pa=65537
printf("*pc=%d\n",*pc); //*pc=00000000 00000001
int* pd=&b;
printf("*pd=%d\n",*pd);
}
引用数组元素,通过变量引用元素内容
#include<stdio.h>
void main()
{
//定义数组: 类型 数组名[长度] “连续”且同类型的存储
int buf[10]={1,2,13,4,5,6,7,8,9,10};
//引用数组元素:下标法--数组下标是从0开始的
// printf("%d %x %x %x\n",buf[0],&buf[0],&buf[1],buf);
//引用元素内容:下标法 指针法
// printf("%x %x %d\n",&buf[2],buf+2,*(buf+2));
//指针变量:
int* pa=buf;
//通过变量引用元素内容
printf("%x %x %d %d\n",buf,pa,*(buf+0),*pa);
//第三个元素:
printf("%d %d %d %d\n",buf[2],*(buf+2),*(pa+2),pa[2]);
}
习题:
将int a=67305985的每一个字节内容输出打印。
#include<stdio.h>
void main()
{
int a = 67305985,i=0;
int* pa = &a;
char* pb=*(char*)pa;
for(i=0;i<4;i++)
printf("%d\n",pb+i);
}
习题:
通过pa来求数组和int buf[10] = {1,2,3,4,5,6,7,8,9,10}; 倒着打印
#include<stdio.h>
void main()
{
int buf[10] = {1,2,3,4,5,6,7,8,9,10};
//通过pa地址倒着打印 通过pa来求数组元素的和
int* pa = buf;
int i = 0,b = 0;
for(i=9;i>=0;i--){
printf("%d\n",*(pa+i));
b = b + *(pa+i);}
printf("和:%d\n",b);
}
习题:
通过pa指针变量来实现二分查找法 (int*left ,int* right)
#include<stdio.h>
void main()
{
//二分法(折半查找):
//1,确定左右区域并指向中间值
//2,key>mid 右侧 key<mid 左侧
int buf[10] = {1,2,3,4,5,6,7,8,9,10};
int* left=buf,*right=buf+9,*mid=NULL;
int key=3;
if(key>*right || key<*left)
printf("不存在");
while(*left<*right)
{
mid=left+(right-left)/2;
if(key>*mid)//右侧
{
left=mid+1;
}
else if(key==*mid)//成功
{
printf("查找成功:%d\n",*mid);
break;
}
else//左侧
right=mid-1;
}
习题:
通过指针实现,插入排序.
#include<stdio.h>
void main()
{
int a[10] = {1,5,6,8,2,3,7,4,9};
int i=0,j=0,temp;
for(i=1;i<9;i++)
{
j=i;
temp = *(a+i);
if(*(a+j)<*(a+j-1))
{
while(j>0 && temp<*(a+j-1))
{
*(a+j)=*(a+j-1);
j--;
}
*(a+j)=temp;
}
}
for(i=0;i<9;i++)
{
printf("%d\n",*(a+i));
}
}