38.【C语言】指针(重难点)(C)

目录:

8.const 修饰指针

*修饰普通变量

*修饰指针变量

9.指针运算

*指针+或-整数

*指针-指针

*指针关系运算

往期推荐

承接上篇37.【C语言】指针(重难点)(B)

8.const 修饰指针

const 全称 constant adj.不变的

*修饰普通变量

cpp 复制代码
#include <stdio.h>
int main()
{
	const int num = 0;
	num = 20;
	printf("%d\n", num);
    return 0;
}

这样写会报错

说明const修饰的值不可改变

注:在C语言中,这里的num是常变量,num的本质还是变量,因为有const修饰,编译器在语法上不允许修改这个变量;而在C++语言中,这里的num就是常量

如果要强行改变,用指针

cpp 复制代码
#include <stdio.h>
int main()
{
	const int num = 0;
	int* pi = &num;
	*pi = 2;
	printf("%d\n", num);
    return 0;
}

但显然已经违反常变量的语法规则,需要限制指针的行动-->const修饰指针变量

*修饰指针变量

三种写法

1.const 放在*的左边

如const int* pi = &num; int const * pi = &num;

语法规则:指针指向的内容不能通过指针来改变,但是指针变量本身的值是可以改

*pi=?; 错误 pi=&n;正确

2.const 放在*右边

如int* const pi = &num;

语法规则: 指针指向的内容能通过指针来改变,但是指针变量本身的值是不可改

*pi=?; 正确 pi=&n;错误

3.const 放在*的左右两边

如const int* const pi = &num;

语法规则:由1,2推, 指针指向的内容不能能通过指针来改变,且是指针变量本身的值是不可改

9.指针运算

*指针+或-整数

37.【C语言】指针(重难点)(B)中已提到一些内容

练习:因为数组在内存中连续存放,所以可以用指针打印数组

cpp 复制代码
#include <stdio.h>
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    int*  pi = &arr[0];
    int length=sizeof(arr)/sizeof(arr[0]);
	for (int i=0;i<length;i++)
    {
		printf("%d ", *(pi+i));//注意pi不变
    }
    return 0;
}

*指针-指针(即地址-地址)

大地址-小地址 和 小地址-大地址 ,注意有正负

cpp 复制代码
#include <stdio.h>
int main()
{
    int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    printf("%d",&arr[8] - &arr);
    return 0;
}

总结:当两个指针指向同一个空间时,(指针-指针)的绝对值==指针之间的元素个数

进一步思考:

求字符串长度:

1.strlen函数

strlen(数组); 统计\0之前的元素个数

cpp 复制代码
#include <stdio.h>
int main()
{
    char arr[] = { "asdfghjk" };
    size_t result=strlen(arr);
    printf("%d", result);
    return 0;
}

具体见20.5.【C语言】求长度(sizeof和strlen)的两种方式

2.用指针

未遇到\0则指针++

cpp 复制代码
#include <stdio.h>
int main()
{
    char arr[] = { "asdfghjk" };
    char* pi = &arr;//&数组名就是&数组名[0]
    int result = 0;
    //可以简写成while (*pi) \0的ASCI值是0
    while (*pi != '\0')//未到\0则继续循环
    {
        result++;
        pi++;//指针移动
    }
    printf("%d", result);
    return 0;
}

也可以改成指针-指针

cpp 复制代码
printf("%d", pi-&arr);

*指针(大小)关系运算

可以用来打印数组

cpp 复制代码
#include <stdio.h>
int main()
{
    int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
    int* pi = &arr;
    int sz = sizeof(arr) / sizeof(arr[0]);
    while (pi < &arr[sz])//&arr[sz]越界不会产生影响
    {
        printf("%d ", *pi);
        pi++;
    }
    return 0;
}

往期推荐:

19.【C语言】指针(重难点)(A)

37.【C语言】指针(重难点)(B)

相关推荐
L Jiawen1 小时前
【Go · Gin】基础知识
开发语言·golang·gin
掘根2 小时前
【消息队列项目】客户端四大模块实现
开发语言·后端·ruby
疯狂的挖掘机8 小时前
记一次基于QT的图片操作处理优化思路(包括在图上放大缩小,截图,画线,取值等)
开发语言·数据库·qt
cnxy1888 小时前
围棋对弈Python程序开发完整指南:步骤4 - 提子逻辑和劫争规则实现
开发语言·python·机器学习
意趣新9 小时前
C 语言源文件从编写完成到最终生成可执行文件的完整、详细过程
c语言·开发语言
李艺为10 小时前
根据apk包名动态修改Android品牌与型号
android·开发语言
黄河滴滴10 小时前
java系统变卡变慢的原因是什么?从oom的角度分析
java·开发语言
老华带你飞10 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
superman超哥10 小时前
Rust Workspace 多项目管理:单体仓库的优雅组织
开发语言·rust·多项目管理·rust workspace·单体仓库
kylezhao201911 小时前
C#通过HSLCommunication库操作PLC用法
开发语言·c#