前言
到目前为止我们看到的数据类型,包括原始数据类型和派生数据类型,都用于描述大小和形状事先已知的数据或数据结构。
然而,有许多程序的数据结构在程序的整个生命周期中的形状和大小可能会发生变化。
我们看到的所有数据类型的变量都是静态变量,因为它们是在程序中声明的,由声明的标识符指定,并且在编译时为它们保留内存空间。
变量的内容在程序执行过程中可能会发生变化,但为该变量预留的内存大小不会发生变化。
但是,C语言允许在运行时创建或销毁变量,因为在程序执行期间需要它们。
由于这些变量没有在程序中声明,所以没有命名,称为匿名变量。 如果一种语言允许创建匿名变量,那么它还必须提供一种引用这些变量的方法,以便可以为它们赋值。 同样,您必须提供一种访问它们的方法。
为此,C语言提供了指针类型。
指针类型和声明为指针类型的变量的行为与其他的变量不同。 直到现在,当我们声明一个特定类型的变量时,该变量可以直接包含该类型的值。 对于指针类型,情况却并非如此。
一、指针的概念
指针是一个变量,其值是另一个变量的内存地址。因此,简单来说,指针就是地址。
指针变量的声明形式:
<数据类型> *<标识符>;
int *entero;
entero是指向整数类型变量的变量指针
char *caracter;
caracter是指向字符类型变量的变量指针
二、指针的运算符与类型
1. 运算符 * & 和内存地址
指针的声明与其余变量相同,但在标识之前使用间接运算符 (*),目的是指向一个变量。
每个内存空间都有一个地址来标识它。
可以使用 & 运算符获取内存地址,后跟变量名。返回变量的地址,将给出变量的实际地址。
请看代码:
int main()
{
int a = 5;
printf("Direccion de a: %p\n", &a);
}
2. 指针的类型
指针的类型 | 大小(字节) 1 | 指针指向的类型 | 大小(字节)2 | 使用示例 |
---|---|---|---|---|
int | 4 | int * | 4 | int *a, *b, *c; |
unsigned int | 4 | unsigned int * | 4 | unsigned int *d, *e, *f; |
short int | 2 | short int * | 4 | short int *g, *h, *i; |
unsigned short int | 2 | unsigned short int * | 4 | usigned short int *j, *k, *l; |
long int | 4 | long int * | 4 | long int *m, *n, *o; |
unsigned long int | 4 | unsigned long int * | 4 | usigned long int *p, *q, *r; |
char | 1 | char * | 4 | char *s, *t; |
unsigned char | 1 | unsigned char * | 4 | unsigned char *u, *v; |
float | 4 | float * | 4 | float *w, *x; |
double | 8 | double * | 4 | double *y, *z; |
long double | 8 | long double * | 4 | long double *a1, *a2; |
三、指针的示例
下面请看两个指针的例子
例一:
int main()
{
float altura = 50.35; // 创建一个高度变量
float *apunta; // 创建一个指针
apunta = &altura; // 指针初始化
printf("\n%.2f", altura); // 打印变量高度的值
printf("\n%.2f", *apunta); // 打印包含指针地址的值
*apunta = 60.80; // 修改指针的值
printf("\nContenido = %.2f", *apunta);// 打印修改后指针地址的值
}
例二:
int main()
{
int *apunt1, *apunt2, *apunt3;
int valor1, valor2, valor3;
// 输入第一个值
printf("Indica el valor 1:\n");
scanf("%d", &valor1);
// 输入第二个值
printf("Indica el valor 2:\n");
scanf("%d", &valor2);
apunt1 = &valor1;
apunt2 = &valor2;
apunt3 = &valor3;
// 两个指针相加
*apunt3 = *apunt1 + *apunt2;
printf("La suma de valor 1 y valor 2 es: %d\n", valor3);
return 0;
}