【C语言】_指针运算

目录

[1. 指针+-整数](#1. 指针+-整数)

[2. 指针-指针](#2. 指针-指针)

[2.1 指针-指针含义](#2.1 指针-指针含义)

[2.2 指针-指针运算应用:实现my_strlen函数](#2.2 指针-指针运算应用:实现my_strlen函数)

[3. 指针的关系运算(大小比较)](#3. 指针的关系运算(大小比较))


1. 指针+-整数

联系关于指针变量类型关于指针类型和指针+-整数相关知识:

原文链接如下:

【C语言】_指针变量-CSDN博客https://blog.csdn.net/m0_63299495/article/details/144883068对于type* p,p+n表示跳过n×sizeof(type)个字节;

以打印一维数组元素(数组在内存中连续存放)为例:

代码示例1:利用下标打印:

cpp 复制代码
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果为:

代码示例2: 利用指针打印:

cpp 复制代码
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++) {
		printf("%d ",*p);
		p++;
	}
	return 0;
}

运行结果如下:

代码示例3:利用指针打印:

cpp 复制代码
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++) {
		printf("%d ", *(p + i));
	}
	return 0;
}

运行结果如下:

2. 指针-指针

2.1 指针-指针含义

指针-指针的绝对值得到的是指针与指针之间元素的个数:

代码示例:

cpp 复制代码
int main() {
	int arr[10] = { 0 };
	printf("%d\n", &arr[9] - &arr[0]);
	printf("%d\n", &arr[0] - &arr[9]);
	return 0;
}

运行结果为:

注:指针-指针运算的前提是两个指针必须指向同一块内存空间:

cpp 复制代码
int main() {
	int arr[6];
	char ch[5];
	printf("%d",&arr[4]-&ch[3]);  //error
}

arr[6]与ch[5]的内存空间未必连续,这样的指针相减运算是没有意义的;

2.2 指针-指针运算应用:实现my_strlen函数

1、strlen函数的功能:计算字符串长度(\0前的字符个数)

cpp 复制代码
int main() {
	char arr[] = "abcdef";
	int len = strlen(arr);
	printf("The length of the array is %d\n" ,len);
	return 0;
}

运行结果如下:

2、实现my_strlen()函数:

实现方式1:

cpp 复制代码
#include<stdio.h>
int my_strlen(char* str) {  
	// 关于形参:arr == &arr[0],用字符指针接收
	int count = 0;
	while (*str != '\0') {
		count++;
		str++;
	}
	return count;
}
int main() {
	char arr[] = "abcdef";
	// 字符串变量末尾暗含一个\0:[a b c d e f \0]
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

运行结果:

实现方式2:

cpp 复制代码
int my_strlen(char* str) {
	char* start = str;
	while (*str != '\0') {
		str++;
	}
	return str - start;
}
int main() {
	char arr[] = "abcdef";
	// 字符串变量末尾暗含一个\0:[a b c d e f \0]
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

运行结果:

3. 指针的关系运算(大小比较)

代码示例:利用指针关系实现数组元素遍历:

cpp 复制代码
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	while (p < arr + sz) {
		printf("%d ", *p);
		p++;
	}
	return 0;
}

运行结果:

相关推荐
梦游钓鱼2 分钟前
C++指针深度解析:核心概念与工业级实践
开发语言·c++
小野嵌入式5 分钟前
3小时精通嵌入式串口通信!从零玩转ESP32+Modbus+OTA(1)
c语言·单片机·嵌入式硬件·mcu·物联网
游乐码10 分钟前
c#索引器
开发语言·c#
jaysee-sjc1 小时前
十三、Java入门进阶:异常、泛型、集合与 Stream 流
java·开发语言·算法
Maggie_ssss_supp1 小时前
Linux-python
开发语言·python
百锦再1 小时前
Java Map常用方法和实现类深度详解
java·开发语言·spring boot·struts·kafka·tomcat·maven
枫叶丹42 小时前
【Qt开发】Qt界面优化(五)-> Qt样式表(QSS) 子控件选择器
c语言·开发语言·数据库·c++·qt
Never_Satisfied2 小时前
在c#中,实现把图片文件拖动到pictureBox控件上
开发语言·c#
独自破碎E2 小时前
BISHI61 小q的数列
java·开发语言
Once_day2 小时前
GCC编译(4)构造和析构函数
c语言·c++·编译和链接