指针
C语言中另一个重要的模块就是指针,使用指针可以使程序更加简洁,紧凑,高效;但对于初学者来说,这一部分相对难以理解。
当你定义一个变量并在程序编译时,系统会根据变量的类型自动给其分配一定的储存空间,但你要如何寻找这处空间?这时你将需要知道它的地址,而至地址,也就是指针;当程序用型时会给变量分配内存空间,而当程序结束时,这些内存空间会被释放,下一次在运行时,又会分配新的内存空间,所以说,如果你想要找变量的地址,每一次调试时,你会发现,所得出的变量的地址都不相同。
#include<stdio.h>
#include<windows.h>
int main()
{
int a=1,b=2;
printf("&a=%5d &b=%5d\n",&a,&b);
system("pause");
return 0;
}
第一次调试
第二次调试
指针变量
指针就是可以通过地址找变量,那当你通过变量找到了一个地址时,这个变量又该怎么称呼呢,答案就是指针变量;指针变量存放的是一般变量的地址,就如同一个盒子一样,装着其他变量的地址;而指针变量也有自己的地址,所以能通过指针变量的地址找到指针变量;指针变量也是变量,所以也有自己的类型,只有变量与指针变量同类型时,指针变量才能存放该变量的地址。
指针变量的定义:
由指针类型和*及指针变量名组成(int * a)。
如:
#include<stdio.h>
#include<windows.h>
int main()
{
int a=1,b=10;
int *n=&a;int*m=&b;int *t;
int move1(int *a,int *b);
printf("a=%d b=%d\n",a,b);
printf("&a=%5d &b=%5d\n",&a,&b);
printf("*n=%d *m=%d\n",*n,*m);
printf("n=%5d m=%5d\n",n,m);
move1(n,m);
printf("a=%d b=%d\n",a,b);
printf("&a=%5d &b=%5d\n",&a,&b);
printf("*n=%d *m=%d\n",*n,*m);
printf("n=%5d m=%5d\n",n,m);
t=n;n=m;m=t;
printf("a=%d b=%d\n",a,b);
printf("&a=%5d &b=%5d\n",&a,&b);
printf("*n=%d *m=%d\n",*n,*m);
printf("n=%5d m=%5d\n",n,m);
system("pause");
return 0;
}
int move1(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
return 0 ;
}
现将变量a,b的地址分别放入指针变量n,m中,并分别输出;经过move函数后,a,b的值交换了,实则交换的是main函数中的a,b;之后将n与m的指针变量交换,也就是说,交换后指针变量这个盒子中的变量的地址相互交换了(交换前,n中存放的是a的地址,m中存放的是b的地址;交换后,n中存放的是b的地址,m中存放的是a的地址);地址是无法交换的,但可以交换存放地址的盒子。
数组指针
一个变量有自己的指针,而一个数组包含多个变量,它的每一个变量也都有自己的指针,而数组整体也有自己的指针;
一维数组:
#include<stdio.h>
#include<windows.h>
int main()
{
int a[10],b;
for(b=0;b<10;b++)
{
a[b]=b;
printf("a[%d]=%d ",b,a[b]);
}
printf("\n");
for(b=0;b<10;b++)
{
printf("&a[%d]=%5d ",b,&a[b]);
}
printf("\na=%d\n",a);
printf("&a=%d\n",&a);
system("pause");
return 0;
}
在一维数组中,数组中每一个元素都有自己的地址,且相邻的两个数组元素地址之差为数组类型所占的字符数;数组名代表数组首元素的地址,而数组的地址代表整个数组的地址,其值等于数组首元素的地址。
二维数组
#include<stdio.h>
#include<windows.h>
int main()
{
int n[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a,b;
for(a=0;a<3;a++)
{
for(b=0;b<4;b++)
{
printf("n[%d][%d]=%d ",a,b,n[a][b]);
}
}
printf("\n");
for(a=0;a<3;a++)
{
printf("\nn[%d]=%d\n",a,n[a]);
for(b=0;b<4;b++)
{
printf("&n[%d][%d]=%d ",a,b,&n[a][b]);
}
}
printf("\n");
printf("n=%d\n",n);
printf("&n=%d\n",&n);
system("pause");
return 0;
}
二维数组中,如上:n[a]代表数组中a+1行中的首元素的地址,n代表数组的首行地址,其等值与数组首元素的地址,而&n代表整个数组的地址,其值也等于数组首元素的地址。
通过指针引用字符串
一个字符串中的字符地址大小递增,所以只需将首字符的地址放入字符型指针中,就可以将整个字符串的地址找到,并找出相应的字符。
#include<stdio.h>
#include<Windows.h>
int main()
{
char *a={"I Love China!"};
printf("a=%p\n",a);
printf("&a[0]=%p\n",&a[0]);
printf("&a=%p\n",&a);
printf("a+2=%p\n",a+2);
printf("*(a+2)=%c\n",*(a+2));
printf("*a=%c\n",*a);
system("pause");
return 0;
}
指针a存放的为a[0]的地址,*a=I
,a+2为字符串第三个字符的地址,*(a+2)
=L,L为字符串第三个字符。