C语言指针{学习笔记}

按变量地址存取变量值的方式称为直接访问方式;

定义特殊变量用来存放地址,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、实参为指针变量,形参为数组名

 

posted @ 2014-11-26 15:19  echo1006  阅读(433)  评论(0编辑  收藏  举报