1、地址->内存字节单元的编号:
冯诺伊曼观点:存储程序思想,即所有信息(软件和硬件)必须建立内存映像才能被程序使用
逻辑地址:虚拟地址,在程序中使用&取得的变量的地址属于逻辑地址
物理地址:程序运行时所占物理内存为地址,对于用户而言不可见
2、指针:用于存放地址的变量,是无符号整型;
指针的类型:指针所指的变量的类型;
int a[4];
int*pt;
pt=a;
a为指针常量
指针的运算
*pt——>通过指针指向变量的内容
pt——>&变量;&求地址
#include<stdio.h>
int main(){
int a,*pta;
float b;
float *ptb;
pta=&a;
a=100;
printf("0:a=%d\n",a);
*pta=*pta+100;
printf("1:a=%d\n",a);
ptb=&b;
*ptb=12.3;
printf("b=%f\n",b);
return 0;
}
指针与一维数组
#include<stdio.h>
int main(){
int a[10]={0,1,2,3};
int*pt;
int i;
for(pt=a,i=0;pt<=&a[9];pt++,i++){
printf("%d:%d\n",i,*pt);
}
return 0;
}
pt=a等价pt=&a[0]
3、指针使用注意事项:防止指针越界访问的问题
1、指针定义后一定要初始化
2、指针一定要指向对应类型的变量
3、指针与数组连用时,一定要防止越界使用
4、指针+/-1表示指针向下或向上拨动一个元素
5、同类型的指针-指针,结果为两指针间的元素个数
4、二级指针
指针本身是变量,指针也占有内存地址,占用4B
因此,指针的也可以被保存----存放指针地址的变量即二级指针
int a;
int *pt;
int **ppt;
pt=&a;
ppt=&pt;
指针数组:为一个数组,数组中有10个元素,每个元素为T类型的指针
T*a[10]
通过字符指针数组只能对字符串进行读操作、不能写,在下面数组中存放的都是字符串的首地址
#include<stdio.h>
int main(){
char*str[3]={
"learning",
"学习",
"C language"
}
printf("%s\n%s\n%s\n",str[])
}
int a=99,b=65,c=89;
int *arr[3]={&a,&b,&c};
int **parr=arr;
printf("%d,%d,%d\n",*arr[0],*arr[1],*arr[2]);
printf("%d,%d,%d\n",**(parr+0),**(parr+1),**(parr+2));
数组指针(与二维数组一起使用)
T(*pt)[10];
pt 是一个指针,指向一个含有10个T类型元素的数组
pt+1将跳过一行,即跳过一个含有10个T类元素的数组
int a[3][4];
二维数组的数组名等于行首地址
5、字符指针、字符数组与字符串
char *pt="abdcc";
将"abdcc"的首地址赋值给pt,由于系统以常量方式来处理"abdcc",故通过字符指针pt仅仅可以对该字符串进行读操作,不能进行写操作
char str[]="abdcc";
将"abdcc"整个拷贝给变量字符数组str,因此通过str可以修改该字符串的内容。由于,str为数组名,即为指针常量,对它的初始化只能在定义时完成
6、带参数的main函数
int main(int argc,char*argv[])
{
}
char*argv[]运行时,命令函数组
int argc;命令行参数个数
二级指针
指针是存放变量地址的变量,例如int, doouble ,char等也可以指向一份指针类型的数据,例如int*,char*,double*
如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针,