按变量地址存取变量值的方式称为直接访问方式;
定义特殊变量用来存放地址,i_pointer的值就是变量i所占用单元的起始地址;存取变量i的值。则要找到存放i的地址的变量,取出地址,然后到地址去取值;
i_pointer=&i;
一个变量的地址称为该变量的指针;
如果有一个变量专门用来存放另一变量的地址(指针),称为指针变量;
区别:指针是一个地址,而指针变量是存放地址的变量;
定义指针变量: 如: int *pointer_1; //int是定义指针变量时必须制定的基类型,指针变量的基类型用来指定该指针变量可以指向的变量的类型;
定义指针变量的一般形式为: 基类型 *指针变量名;
函数的参数也可以是指针类型,将一个变量的地址传送到另一个函数中;
以变量名和数组名作为函数参数的比较:
1.如果形参的类型为变量名,传递的是变量的值,不能通过函数调用改变实参的值
2.如果形参的类型为数组名或指针变量,传递的是实参数组首元素的地址,能通过函数调用改变实参的值;
指针变量做实参,必须先使指针变量有确定值,指向一个已定义的单元;
用数组名作参数时,如果形参数组中各元素的值发生变化,实参数组元素的值随之变化;
如果实参是数组名(即代表该数组首元素的地址),形参则需要定义指针变量(只有指针变量才能存放地址),常用这种方法通过调用一个函数来改变实参数组的值;
实参数组名代表一个固定的地址,或者说是指针常量,但形参数组并不是固定的地址值,而是作为指针变量,在函数调用开始时,它的值等于实参数组首元素的地址,在函数执行期间,它可以再被赋值;
归纳:
如果有一个实参数组,要想再函数中改变此数组中的元素的值,实参与形参对应的关系有以下4种情况:
a、形参和实参都用数组名
//数组名做形参和实参;
#include<studio.h>
void 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 (int i = 0; i < 10;i++)
{
/* code */printf("%d\n",a[i] );
printf("\n");
}
inv(a,10);
printf("the array has been inverted:\n");
for (int i = 0; i <10; ++i)
{
/* code */printf("%d\n",a[i]);
printf("\n");
}
}
void inv(int x[],int n)
{
int temp,i,j,m=(n-1)/2;
for (int i = 0; i <= m; i++)
{
/* code */j=n-1-i;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
return;
}
b、实参用数组名,形参用指针变量
//指针变量做形参,数组名作实参;
#include <studio.h>
void main()
{
void inv(int *x,int n);
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("the original arrag:\n");
for (int i = 0; i < 10; i++)
{
/* code */printf("%d\n",a[i] );
printf("\n");
}
inv(a,10);
printf("the array has been inverted:\n");
for (int i = 0; i < 10; i++)
{
/* code */printf("%d\n",a[i]);
printf("\n");
}
}
void inv(int *x,int n)
{
int *p,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for (; i <=p; i++,j--)
{
/* code */temp=*i;
*i=*j;
*j=temp;
}
return ;
}
c、实参形参都用指针变量
//指针变量做实参和形参
#include<studio.h>
void main()
{
void inv(int *x,int n);
int i,arr[10];
int *p=arr;
printf("the original array:\n");
for (int i = 0; i < 10;p++)
{
scanf("%d",p);
printf("\n");
}
p=arr;
inv(p,10);
printf("the array has been inverted:\n");
for (int p=arr; p<arr+10; p++)
{
printf("%d\n",*p);
printf("\n");
}
}
void inv(int *x,int n)
{
int *p,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for (; i <= p; i++;j--)
{
/* code */j=n-1-i;
temp=*i;
*i=*j;
*j=temp;
}
return;
}
d、实参为指针变量,形参为数组名