首页 > 其他分享 >【C语言初阶】指针运算

【C语言初阶】指针运算

时间:2024-04-06 11:59:37浏览次数:21  
标签:初阶 运算 示例 int C语言 vp str 指针

【C语言初阶】指针运算

文章目录

四、指针运算

1 介绍

指针能进行的运算有:

  • 指针 ± 整数
  • 指针 - 指针
  • 指针的关系运算


2 指针 ± 整数

2.1 示例

代码示例

#include<stdio.h>

#define VALUE 10
int main()
{
	//指针 +- 整数

	float values[VALUE];
	float* vp = NULL;

	for (vp = &values[0]; vp < &values[VALUE];)
	{
		*vp++ = 0;
		//*vp=0; vp++;
	}

	return 0;
}

解释说明

1 指针 ± 整数,表示指针向前或向前走一步有多大(距离)


3 指针 - 指针

| 指针 - 指针 | :得到的是指针与指针之间的元素个数

前提指针必须指向同一块内存

3.1 示例

代码示例

#include<stdio.h>

int main()
{
	//指针 - 指针

	int arr[10] = { 0 };
	printf("%d\n", &arr[9] - &arr[0]);//9

	return 0;
}

解释说明

1 |指针-指针| 得到的是指针与指针之间的元素个数

2 下标为9的元素与下标为0的元素,中间相差9个元素


3.2 模拟实现 strlen()

3.2.1 方法一:指针 - 指针

代码示例

#include<stdio.h>

//模拟实现strlen()
#include<assert.h>//assert()
int my_strlen(const char* str)
{
	assert(str);//字符串为空就触发警告

	char* p = str;
	//寻找字符串结束标志\0
	//while (*p != '\0')
	//{
	//	p++;
	//}
	//
	//while (*p)
	//{
	//	p++;
	//}
	while (*p++)
        continue;
	p--;//循环中p最后指向\0的下一位,需要-1移动到\0的位置

	return p - str;//指针-指针,得到的是指针与指针之间的元素个数
}
int main()
{
	//方法一:指针-指针

	int ret = my_strlen("hello");
	printf("len = %d\n", ret);//5

	return 0;
}

解释说明

1 字符指针 p 移动至 \0 的位置,然后减去起始位置的指针 str,最终得到二者之间的字符个数(字符串长度)

2 assert(str) 断言,检查传入的字符指针 str 是否为空。需要包含头文件 #include<assert.h>


3.2.2 方法二:计数器

代码示例

#include<stdio.h>

#include<assert.h>
int my_strlen(char* str)
{
	assert(str);//断言

	int count = 0;
	while (*str++ != '\0')
		count++;

	return count;
}
int main()
{
	//方法二:计数器

	int ret = my_strlen("hello");
	printf("len = %d\n", ret);//5

	return 0;
}

解释说明

1 while (*str++ != '\0')寻找 \0 ,每找一个不是 \0 的字符,计数器+1


3.2.3 方法三:函数递归

代码示例

#include<stdio.h>

int my_strlen(char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
int main()
{
	//方法三:函数递归

	int ret = my_strlen("hello");
	printf("ret = %d\n", ret);

	return 0;
}

解释说明

1 递归实现,每访问一个非 \0 字节的地址,就返回计数+1再次函数调用寻找 \0

  直到找到 \0 就返回字符计数,即得到最终的字符个数(字符串长度)。


4 指针的关系运算

地址是一个数值,也是有大小的,一般用十六进制数表示

指针的关系运算就是比较指针的值,也就是比较地址的大小

4.1 示例1

示例

for(vp = &values[VALUES]; vp > &values[0]; )
{
	*--vp=0;
}

说明

1 vp >= &values[0] :指针的关系运算,比较两个地址的大小

2 &arr[n] > &arr[0]数组长度充当下标进行关系运算是可以的

数组末尾元素后一地址

4.2 示例2

示例

for(vp = &values[VALUES-1]; vp >= &values[0]; vp--)
{
	*vp=0;
}

说明

1 vp >= &values[0] 指针的关系运算,比较两个地址的大小。

2 &arr[0] > &arr[-1]不允许数组首元素的地址与首元素前一个位置的地址进行关系比较
数组首元素前一地址

3 这样比较可能会出问题,因为这是标准未定义的关系运算,并不一定保证可行


4.3 标准规定

C语言标准规定,允许指向数组元素的指针指向数组最后一个元素之后内存位置的指针进行关系比较,但是不允许与指向首元素之前内存位置的指针进行关系比较。


总结:

  本节介绍了指针的运算,包括指针 ± 整数、指针 - 指针以及指针的关系运算。


感谢您的阅读!如有任何错误,欢迎您的批评指正!

标签:初阶,运算,示例,int,C语言,vp,str,指针
From: https://blog.csdn.net/qq_43108974/article/details/137423787

相关文章

  • 【C语言初阶】指针
    【C语言初阶】指针文章目录【C语言初阶】指针一、指针是什么?1指针是什么?2内存2指针变量2.1示例2.2总结3如何编址?3.1编址3.1总结二、指针和指针类型1指针的类型1.1示例2指针+-整数2.1示例2.2总结3指针的解引用3.1示例3.2总结总结:本章目标:......
  • 练手项目层初阶1—《详解静态版本——通讯录管理系统》
    文章目录......
  • 中国电子学会(CEIT)2021年09月真题C语言软件编程等级考试三级(含详细解析答案)
    中国电子学会(CEIT)考评中心历届真题(含解析答案)C语言软件编程等级考试三级2021年09月编程题五道 总分:100分一、菲波那契数列(20分)菲波那契数列是指这样的数列:数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a......
  • 《C++程序设计》阅读笔记【4-指针(2)】
    ......
  • 【华为OD机试真题】211、最优资源分配、芯片资源占用 | 机试真题+思路参考+代码分析(C
    文章目录一、题目......
  • C语言简易版杀戮尖塔
    此代码仅包含4种卡牌(可增加其它id的卡牌效果函数)此项目仅有一个固定攻击模式的boss。以下是实现代码,#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>intdeck[10]={1,1,1,1,2,2,2,2,3,4};inthand[5]={0};......
  • 【c语言】自定义类型:联合体(公用体)【详解】
    联合体联合体类型的声明像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共用体。给联合体其中⼀个成员赋值,其他成员的值也跟着变化。......
  • c语言之多重指针
    多重指针是定义了一个指针a后,又定义一个指针b引用指针a的地址,就叫多重指针多重指针定义的方法:类型名**指针名#include<stdio.h>intmain(){ inta; a=3; int*p=&a; int**y=&p; printf("%d\n",a); printf("%d\n",*p); printf("%d\n",**y); return0;}上面代码......
  • c语言之指针数组
    在c语言中,一个数组元素是由指针组成的,就叫指针数组。指针数组的定义方法类型名*数组名[数组长度]如果要处理多个字符串,用指针数组会方便多。举个例子,代码如下#include<stdio.h>intmain(){ inti; char*s[]={"cprogram","control","logic"}; for(i=0;i<3;i++) ......
  • 【C语言学习】之字符数组与字符串处理函数
    1.字符数组1.字符数组的初始化1.单字符形式chara[3]={'a','b','c'}                定义一个字符型一维数组,数组名a,三个下表变量a,b,ccharb[][3]={'a','b','c','d','e','f','g'}  ......