指针进阶第一弹

一、类型

指针可以分为整形指针、字符指针、数组指针、空指针等。我们挨个进行介绍。

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的指针,完成整个数组的打印操作;

以上便是我自己的见解,如果有错误的地方,欢迎大家进行指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独爱满天星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值