一、类型
指针可以分为整形指针、字符指针、数组指针、空指针等。我们挨个进行介绍。
1.整形指针
整形指针就是存放整形的指针,例如int a=10; int* pa=&a;这里面pa就是一个整形指针,它指向整形a,存放a的地址。
2.字符指针
存放字符的指针,我们也可以使用字符指针来访问整个字符串。
例如如下代码:
#include<stdio.h>
int main()
{
char a='w';
char* pa=&a;//pa就是一个字符指针,指向字符a,存放字符a的地址
char* ps="hello world";
char* p1="hello world";
printf("%s\n",ps);
printf("%s\n",p1);
return 0;
}
大家认为结果会是怎样的呢?如果去运行这个代码,大家得到的结果可能会不一样,有的可能会运行不了,会报错,有的会发现打印结果,两者都是一样的,都打印了hello world;
首先,关于报错,在不同编译器上会有不同的行为,char* p="hello world",定义一个字符指针并对其初始化为一个字符串“hello world",这个时候是把它放在了静态数据区里的,是不可修改的。有的编译器不支持这样的行为,所以我们使用const char*p="hello world"会更好。这个问题是一个历史问题,有感兴趣的小伙伴可以去搜索了解一下。
其次,关于结果一样的问题,是因为存放的时候,本质上是吧字符串的首地址存储在ps和p1中,而两者内容是一样的,所以计算机会建立一块内存,里面的内容是“hello world”,然后ps和p1都会指向这块内存的地址。所以ps和p1共用一块内存空间,ps==p1,两者的地址也相同,小伙伴们可以去尝试一下。
3.数组指针
数组指针就是存放数组的指针
如以下代码:
#include<stdio.h>
int main()
{
int a = 10;
int *Pa = &a;
int arr[10] = { 1,2,3,4,5 };
int(*parr)[10] = &arr;
return 0;
}
parr就是一个数组指针,对于int(*parr)[10]=&arr; parr首先和*结合,它是一个指针,其次,它指向一个数组,它的类型是整形。所以它是一个指向整形数组的指针。
关于怎么书写的问题,我们这样写:
double* d[5];这是一个数组,它里面的元素是double类型的指针,这是一个指针数组。
我们把它写成一个数组指针,我们怎么写呢?
首先,我们起一个名字,pd,他是一个指针,那么就是*pd,它要指向数组d,那么它的元素个数和d相同,那么就是(*pd)[5],最后数组里面元素的类型是double*,所以最后就是double* (*pd)[5]=&d;大家学会了吗?
4.空指针和野指针
空指针,字面意思就是它里面什么都没有,他不指向任何东西,也不指向任何对象,我们要把他和野指针进行区分,野指针是指向了某个地方的,不过我们没有规定,所以就会违规访问。我们常常用空指针来进行初始化,避免野指针的出现。
二、数组指针的应用
其他指针类型,我们会经常用到,我在这里就不过多提及,在这里用一个简单的小例子,使用一下数组指针,让大家更熟悉它。
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int(*pa)[10] = &arr;//指向整个数组
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", *((*pa)+i));
}
return 0;
}
在这里,pa指向数组arr;我们先对pa进行解引用操作,我们就可以得到arr的首元素地址,我们运用循环,访问到每个元素,然后再次进行解引用操作,便可以得到每个元素的值。我们就可以利用数组a的指针,完成整个数组的打印操作;
以上便是我自己的见解,如果有错误的地方,欢迎大家进行指正!