昨天学习队列运行Demo的时候遇到了一个小问题,就是声明队列指针的时候,忘记给指针赋值。导致运行了好几次都没啥反应。下面是我的错误代码:
#include "stdio.h"
#include "CirQueue.c"
int main(){
CirQueue *Q;
InitQueue(Q);
return 0;
}
平常写的java,几天不用c,都忘记怎么使用了,今天还是决定再来复习一下指针,顺便记录下。
一、什么是指针?
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。
就像其他变量或常量一样,在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type var-name;
type:是c语言中的数据类型。
* : 是声明指针的标志。*后面的变量会被声明为指针类型
var-name:指针变量名称。
例如:
int a,*b,c;
double *x;
上面声明了三个int类型的变量和一个double类型变量。其中b和x前面有 * 修饰则表示为 int 类型指针变量和double 类型指针变量。
指针的值的实际数据类型是一个代表内存地址的长的十六进制数。
二、如何使用指针
1.定义一个指针变量、
2. 把变量地址赋值给指针、
3. 访问指针变量中可用地址的值
例子:
int main(){
int a,*b; //声明变量
a = 10;
b = &a; //使用&符号获取变量的内存地址,赋值给b
*b = 100; //使用*符号获得a的值并修改
printf("a = %d\n",a); //%d替换a的值
return 0;
}
上面例子运行结果:
a = 100
上面就是一组使用指针来获取并修改值得例子。
C中的NULL指针
int main(){
int *c = NULL;
printf("c的地址是:%p\n",c);//使用%p来替换指针c
return 0;
}
运行结果:
c的地址是:0000000000000000
可以看出NULL 指针是一个定义在标准库中的值为0的常量。内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。
但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
所有指针在创建时都要初始化,如果不知道他指向什么就将 0 赋值给他。必须初始化指针,没有被初始化的指针被称为失控指针(野指针)。
三、指针的算术运算
递增运算
int main(){
int *c;
int arr[] ={10,20,30};
c = arr;
printf("c的地址是:%p\n",c);
for (int i = 0; i < 3; i++)
{
printf("存储地址:arr[%d] = %p\n",i,c);
printf("存储值: arr[%d] = %d\n",i,*c);
c++; //移动到下一个指针
}
return 0;
}
运行结果如下:
c的地址是:000000000061FE08
存储地址:arr[0] = 000000000061FE08
存储值: arr[0] = 10
存储地址:arr[1] = 000000000061FE0C
存储值: arr[1] = 20
存储地址:arr[2] = 000000000061FE10
存储值: arr[2] = 30
可以看出c的地址也就是数组arr的地址等于arr[0]。
arr[0],arr[1],arr[2]地址间隔4个字节,因为在当前运行环境下,一个整数占4个字节。所以每移动一个位置,内存地址就会增加4个字节。
递减运算
int main(){
int *c;
int arr[] ={10,20,30};
c = &arr[2];
printf("c的地址是:%p\n",c);
for (int i = 2; i >= 0; i--)
{
printf("存储地址:arr[%d] = %p\n",i,c);
printf("存储值: arr[%d] = %d\n",i,*c);
c--; //移动到下一个指针
}
return 0;
}
运行结果如下:
c的地址是:000000000061FE10
存储地址:arr[2] = 000000000061FE10
存储值: arr[2] = 30
存储地址:arr[1] = 000000000061FE0C
存储值: arr[1] = 20
存储地址:arr[0] = 000000000061FE08
存储值: arr[0] = 10
比较运算
已经赋值的指针的值是某一对象的内存地址,是一个16位长度的的十六进制数,所以可以进行大小的比较。
我们可以将上面的例子修改一下:
int main(){
int *c;
int arr[] ={10,20,30};
c = &arr[2];
printf("c的地址是:%p\n",c);
int i=2;
while (c>=arr)
{
printf("存储地址:arr[%d] = %p\n",i,c);
printf("存储值: arr[%d] = %d\n",i,*c);
c--; //移动到下一个指针
i--;
}
return 0;
}
运行结果:
c的地址是:000000000061FE10
存储地址:arr[2] = 000000000061FE10
存储值: arr[2] = 30
存储地址:arr[1] = 000000000061FE0C
存储值: arr[1] = 20
存储地址:arr[0] = 000000000061FE08
存储值: arr[0] = 10
当c的地址大于等于arr的地址时候,做递减运算。
指针的简单实用就介绍这么多了(目前只会这么多…),等后面遇到其他的问题在加上吧。
参考:菜鸟教程-c语言教程