地址的引入
首先我们引入一个场景:
A:你好请问附近哪里有花店?
B:有“菊花台”花店
A:请问菊花台花店在哪里?
B:直走,左拐,右拐,直走;(中山路102号107)
也就是说A去花店有两种方式
- 通过店名一路问过去
- 通过花店地址直接找到
上边的这个场景就对应了C语言变量的访问。
而变量名的访问有两种方式: - 变量名
- 变量地址
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int juHuaTai = 10;
int meiGuiTai = 9;
//通过变量名访问
printf("ju = %d\n",juHuaTai);
printf("mei = %d\n",meiGuiTai);
//&是取地址运算符,变量名所代表的变量地址
printf("ju的地址是:%p\n",&juHuaTai);
printf("mei的地址是:%p\n",&meiGuiTai);
//通过地址访问
printf("通过地址来获取ju:%d\n",*(&juHuaTai));//此时 *代表的是一个运算符,功能是取出内存地址中的数据(取内容运算符)
printf("通过地址来获取mei:%d\n",*(&meiGuiTai));
system("pause");
return 0;
}
指针变量
关于数组我们知道了使用数组来存储多个同类型的数据并进行运算,前提是我们要知道数组的长度,给定以后便不能再改变。那么我们假若不知道需要处理的数据量,利用数组倒也是可以实现,那就是估计一个数组上限,但这样常常会造成空间浪费。
由此我们就有了指针来存储空间的动态分配。
指针:就是我们上文所说的,通过地址访问操作数据,用指针访问内存和操纵地址。
指针变量:那么和为指针变量呢?即转没用来存放变量地址的变量。
我们举一个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x ;
x = 1000;
int *p;
p = &x;
//我们就说p是一个指针变量
//我们就可以通过p间接访问x.
system("pause");
return 0;
}
指针变量的定义:
一般形式:
类型名 *指针变量名
定义指针变量要使用指针声明符 *。
另外我们还需要知道:
- C语言使用指针对变量的地址进行操作。
- 指针是用来存放内存地址的变量。
- 如果一个指针变量的值是另一个变量的地址,那么就称该指针变量指向另外一个变量。
- 定义多个指针变量时每一个指针变量前面都要加上*号。
指针变量的初始化:
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x ;
int *p = &x;
system("pause");
return 0;
}
这里我们要知道的是,初始化时指针变量名前边的*值是代表它是一个指针变量。
指针类型
指针变量定义时的数据类型要和它所指向的变量的数据类型要一致。也就是说什么类型的指针存放什么类型的数据的地址。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int *p; //只能存放整数的地址
char *p2; l//只能存放字符数据的地址
int a = 10;
char c = "A';
p= &a;
// p=&c判断计算机的大小瑞
p2 = &c;
printf ("a=%d\n" ,*p);
printf ( "c=%c\n" ,*p2);
//指针++
prihtf ( "a的地址打印:%p\n",p) ;
printf ( "a的地址++打印: %p\n",++p);
printf ("c的地址打印:%p\n",p2) ;
printf ("c的地址++打印: %p\n",++p2) ;
system ( ""pause" ) ;
return 0;
数组的指针
数组名本身也是一个地址即指针,但是指针是以地址为值的变量,而数组名的值是一个特殊的固定地址,可以看做指针常量。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int array[3]= {1,2,3};
printf("第一个元素的地址%p\n" , &array[0]);
printf("第二个元素的地址%p\n" , &array[1]);
printf("第三个元素的地址%p\n" , &array[2]);
system ( ""pause" ) ;
return 0;
我们知道数组关心的是首地址,两种表示方式:
- 数组名 = 地址
- 第一个元素的地址
于是我们可以写作以下形式:
int *parray;
parray = &array[0];
//parray = array;
printf("第一个元素的地址%p\n",parray++);
printf("第二个元素的地址%p\n",parray++);
printf("第三个元素的地址%p\n",parray++);
于是我们便可以知道用指针遍历数组的方式
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int array[3]= {1,2,3};
int *parray;
parray = &array[0];
for(i=0;i<3;i++){
printf(" %d ",*parray) ;
parray++;
}
/*由数组名 = 地址又可以如下操作
for(i=0;i<3;i++){
printf(" %d ",parray[i]) ;
parray++;
}
*/
system ( ""pause" ) ;
return 0;