计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个内存地址。
scanf_s("%d",&n); //使用地址运算符&获得变量n的存储地址
char str[10];gets_s(str,10) //一维数组的名称str代表该数组在内存中的首地址
&n就是变量n的指针,str就是字符数组str[10]的指针。
C语言允许用一个变量来存放指针,这种变量称为指针变量,指针变量的值就是某个内存单元的地址。
(一)指针变量的定义
定义指针变量的一般格式为:
类型标识符 *指针变量名;
(1)"类型标识符"表示该指针变量所指向的变量的数据类型。
(2)一个指针变量只能指向同一种类型的变量,不能定义一个变量指针即能指向整型变量又能指向其它类型变量。
(3)"指针变量名"前的"*"是指针标识符,不能省略。
(4)定义指针变量时,和基本类型变量一样,可以进行初始化,即赋初值。
(5)空指针:指针变量被初始化为NULL,其值为0,该指针不指向任何有效数据。
//指针变量的定义演示1
#include<stdio.h>
int main()
{
int n; //定义一个整型变量n
int* p; //定义一个指针变量p,仅能存放int 型变量的地址 (定义)
p = &n; //将整型变量n的地址存放到p (初始化)
//可以将定义与初始化合并
//int* p = &n;
scanf_s("%d", p); //等价于scanf_s("%d",&n);
printf("%d", *p); //等价于printf("%d",n);
return 0;
}
//指针变量的定义演示2
#include<stdio.h>
int main()
{
char str[10];
char* cp;
cp = str; //将字符数组 str 的首地址存放到 cp 中
//可以将定义与初始化合并
//char* cp = str;
gets_s(cp, 10);
puts(cp);
return 0;
}
//随堂练习8-1
1.有"double s;",定义一个指向变量 s 的指针变量 q 。
double *q = &s;
2.编程验证演示(1)和演示(2)中,指针变量的值是否与其所指向变量的地址相同。
(1)
#include<stdio.h>
int main()
{
int n;
int* p = &n;
scanf_s("%d", p);
printf("%p\n", p); //输出指针变量p的值
printf("%p\n",&n); //输出p所指向变量n的地址
return 0;
}
(2)
#include<stdio.h>
int main()
{
char str[10];
char* cp = str;
gets_s(str, 10);
printf("%p\n", cp); //输出指针变量cp的值
printf("%p\n", str); //输出cp所指向字符数组str的首地址
return 0;
}
结论:指针变量的值与其所指向变量的地址相同。