C/C++之指针进阶

 个人主页:

仍有未知等待探索_小项目,洛谷刷题,数据结构-CSDN博客     

专题分栏---C语言疑难:

  C语言疑难_仍有未知等待探索的博客-CSDN博客

        今天,既是为了我自己来巩固进阶指针的知识,也是为了兄弟们能明白这块知识点。

目录

一、指针前瞻

二、指针进阶

1、字符指针

2、数组指针

3、指针数组

4、函数指针

5、习题解析


一、指针前瞻

1.指针是个变量,用来存放地址的。接下来用图进行形象的描述:

a里面存的是整型10,b里卖弄存的是a的地址。a叫做整型变量,而b叫做指针。

指针和地址其实是划等号的。 

2.指针的大小为4/8个字节(32位平台/64位平台)。

3.指针是有类型的,指针的类型决定了指针+整数的步长和指针解引用时候的操作权限。

 a1原来的地址是61fc30,a1+1之后的地址是61fc34,指针加1之后的地址加了4个字节,相当于加了一个整型所占的字节。剩下两个也同理加了一个数据类型的字节。

    4.指针运算

#include<stdio.h>
int main()
{
	int a[10] = {10};
	int* b = a;
	int* c = a + 5;
	printf("%d", c-b);
	return 0;
}

两个指针相减本质上是两个指针所指数组之间相差的元素个数

二、指针进阶

1、字符指针

 const 修饰的变量里面的内容不能改,常量字符串也不能改,所以a,b指向的是同一个空间。

2、数组指针

数组指针的本质是指向数组的指针。

3、指针数组

指针数组的本质是存放指针的数组。

4、函数指针

所谓函数指针即定义一个指向函数的指针变量。

#include<stdio.h>
int Add(int x, int y)
{
    return x+y;
}
int main()
{
    int(*p)(int,int)=NULL;
    p=Add;
    return 0;
}

然后可以对p进行解引用操作来调用函数。 

5、习题解析

#include<stdio.h>
#include<string.h>
int main()
{
	const char* a="abcdefg";
	const char b[] = { 'a','b','c','d','e','f','g' };
	printf("%d\n", strlen(a));
	printf("%d\n", sizeof(a));
	printf("%d\n", strlen(b));
	printf("%d\n", sizeof(b));
	return 0;
}

首先,strlen是用来计算字符串长度的,遇到'\0'结束(不包括‘\0’);而sizeof是一个运算符,sizeof算的是空间大小,单位是字节。

对于常量字符串“abcdefg”,他其实是相当于{'a','b','c','d','e','f','g',‘0’}。

strlen(a)其实就是等于7;

sizeof(a)其实算的是a变量所占的空间的大小,因为a是指针类型所以占4/8字节;

strlen(b)因为b数组里面存的没有‘\0’,所以会接着往下运行,直到遇见‘\0’。所以是随机值

sizeof(b)算的就是整个数组的空间大小,一共有7个元素,每个元素的类型是char类型,                       所以最终的算的是7*1个字节。

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

仍有未知等待探索

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

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

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

打赏作者

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

抵扣说明:

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

余额充值