1.一个变量的地址称为该变量的指针;
用来存放指针的地址的变量称为指针变量;
2.&取地址运算符,&a为变量a的地址;
* 指针运算符(或称“间接访问”运算符),*p表示指针变量p指向的对象;
eg:输入a和b两个整数,按先大后小的顺序输出a和b。
#include<stdio.h>
int main()
{
int * p1,* p2,* p,a,b;
printf("please enter two integer numbers : ");
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a<b)
{p=p1;p1=p2;p2=p;}//或者可以写作:p1=&b;p2=&a;
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d",*p1,*p2);
return 0;
}
3.指针变量作为函数参数:
#include<stdio.h>
int main()
{
void swap(int * p1,int * p2);
int a,b;
int * pointer_1,* pointer_2;
printf("please enter a and b : ");
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a<b) swap(pointer_1,pointer_2);
printf("max=%d,min=%d",a,b);
return 0;
}
void swap(int * p1,int * p2)
{
int temp;
temp=* p1;
* p1=* p2;
* p2=temp;
}
如果写成这样就是错的,
void swap(int * p1,int * p2)
{
int * temp;
* temp=* p1;
p1=* p2;
p2=* temp;
}
写成这样,a,b的值并未互换:
void swap(int x,int y)
{ int temp;
temp=x;
x=y;
y=temp;
}
用指针变量作为函数参数时要遵循这一规则:不能通过执行调用函数来改变实参指针变量的值电视可以改变实参指针所指变量的值。
4.用数组名作为函数参数
eg:将数组a中n个整数按相反顺序存放:
#include<stdio.h>
int main()
{
void inv(int x[],int n);
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("the original array: \n");
for(i=0;i<10;i++)
printf("%d\t",a[i]);
printf("\n");
inv(a,10);
printf("the array has been inverted: \n");
for(i=0;i<10;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}
void inv(int x[],int n)
{
int temp,i,j,m=(n-1)/2;
for(i=0;i<=m;i++)
{
j=n-1-i;
temp=x[i];x[i]=x[j];x[j]=temp;
}
return;
}
将inv中的形参改成指针变量:
#include<stdio.h>
int main()
{
void inv(int x[],int n);
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("the original array: \n");
for(i=0;i<10;i++)
printf("%d\t",a[i]);
printf("\n");
inv(a,10);
printf("the array has been inverted: \n");
for(i=0;i<10;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}
void inv(int * x,int n)
{
int temp,* p,* i,* j,m=(n-1)/2;
i=x;
j=x+n-1;
p=x+m;
for(;i<=p;i++,j--)
{
temp=* i;* i=* j;* j=temp;
}
return;
}
6.多维数组:
二维数组名(如a)是指向行的。因此a+1中的“1”代表一行中全部元素所占的字节数。一维数组名(如a【0】,a【1】)是指向列元素的。a【0】+1中的1代表一个a元素所占的字节数。在指向行的指针前面加一个就是转换为指向列的指针。例如,a和a+1是指向行的指针,在他们前面加一个就是* a和 * (a+1),她们就成为指向列的指针,分别指向a数组的0行0列的元素和1行0列的元素。反正,在指向列的指针前面加&,就成为指向行的指针。例如a【0】是指向0行0列的指针,在它前面加一个&,为&a【0】,由于a【0】和* (a+0)等价,因此&a【0】与&*a等价,也就是与a等价,它指向二维数组的0行。
(这里好难 ,需要多看8.3.5)
7.通过字符数组名或者字符指针变量可以输出一个字符串,而对一个数值型数组,是不能企图用数组名输出它的全部元素的。
(8.4通过指针引用字符串,还需要学习,real难)
8.返回指针值得函数
int a(int x , int y ),a是函数名,调用它以后能得到一个int 型(指向整型数据)的指针,即整型数据的地址。x和y是函数a的形参,为整型。
9.指针数组
一个数组,若其元素均为指针类型数据,成为指针数组,int * p[4].
指针数据的元素只能存放地址,不能存放整数。
指向指针的指针:char * * p = char * (* p)表示:p指向一个字符指针变量(这个字符指针变量指向一个字符型数据),前面的char * 表示p指向的是char * 型的数据。
10.建立内存的动态分配
(1)malloc函数:在内存的动态存储区分配一个长度为size的连续空间;
(2)calloc函数:在内存的动态存储区分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。
(3)free函数:释放指针变量p所指向的动态空间,是这部分空间能重新被其他变量使用。
(4)realloc函数:如果已经通过malloc函数或者calloc函数获得了动态空间,想改变其大小,可以用recalloc函数重新分配
注:这些函数包含在头文件:# include<stdib.h>
中。
这章学的不扎实,以后用到的时候再仔细推敲。