【问题】数据在内存中是如何存储和读取的?
在程序中定义一个变量后,在对程序编译的时候,系统就会给这个变量分类内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。例如:一般整型为2个字节,单精度浮点类型分类4个字节,对字符型分配一个字节。内存区的每一个字节有一个编号,这就是“地址”。
一定要弄清楚内存单元的地址域内存单元的内容这两个概念。以宾馆房间号为例,地址就是房间号,单元内容就是住在这个房间里的客人。在程序中一般通过变量名来对内存单元进行存取。其实,程序经过编译以后已经将变量名变为变量的地址,对变量值的存取都是通过地址进行的。
【直接 访问】
按照变量地址存取变量值的方式称为直接访问。
【间接访问】
将变量的地址存放在另一个变量中,它是一种特殊的变量,用于存放地址。
【总结】
在C语言中,将地址形象的称之为“指针”。意思是通过它能够找到以它为地位的内存单元。一个变量的地址称为“指针”。一个变量专门存放另一个变量地址的变量,称之为“指针变量”。指针是一个地址,为指针变量是存放地址的变量。
为了表示指针变量和它所指向变量之间的联系,在程序中用“*”符号表示“指向”的对象。如果已经定义i_pointer为指针变量,则(*i_pointer)是i_pointer所指向的变量。例:
C语言规定,所有变量在使用前必须定义,指定其类型,并按照此分配内存单元。指针变量不同于整型变量和其它类型的变量,它是专门用来存放地址的,必须将它定义为“指针类型”。
int i,j;
int *pointer_1,*pointer_2;
第一行定义了两个整型变量,第二行定义了两个指针便变量:pointer_1和pointer_2,它们是指向整型变量的指针变量。
怎样使一个指针变量指向另一个变量呢?
可以使用赋值语句是一个指针变量得到另一个变量的地址,从而使它指向该变量。
pointer_1 = &i;
pointer_2 = &j;
将变量i的地址放在指针变量pointer_1 中,因此pointer_1 就指向了变量i.
在定义指针时注意两点:
指针变量只能存放地址,不要将一个整数赋值给一个指针变量。例“
```c
#include
void main()
{int a,b;
int *pointer_1,*pointer_2;
a = 100;b = 10;
pointer_1 = &a;
pointer_2 = &b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*pointer_1,*pointer_2);
}
运行结果
100,10
100,10
函数的参数不仅可以时整数、浮点型、字符型等数据,还可以时指针类型。它的作用是将一个变量的地址传到另一个函数中。例:
#include
void main()
{void swap(int *p1,int *p2); //函数的声明
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d\n",&a,&b)
pointer_1 = &a; pointer_2 = &b;
if(a<b) swap(pointer_1,*pointer_2);
printf("%d,%d\n",a,b);
}
void swap(int *p1,int *p2)
{ int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
运行结果:
5,9
9,5
形参值的改变不能使实参值发生改变。而应该用指针变量作为函数参数,在函数执行过程中使用指针变量所指向的变量值发生变化,这样就实现了”通过调用函数是变量的值发生变化,在主调函数中可以使用这些改变了的值‘的目的。
C语言中实参变量和形参变量之间的数据传递时单向的“值传递”。指针变量作为函数函数也要遵守这一规则。不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。