C语言指针+-整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组

文章目录


前言

C语言指针±整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组等介绍,还包括指针数组将几个一维数组模拟为二维数组等的介绍。


一、指针 ± 整数

c 复制代码
// 指针加1遍历数组
#include <stdio.h>
int main()
{
	int arr[10] = { 0 };

	int sz = sizeof(arr) / sizeof(arr[0]);

	int i = 0;
	int* p = arr;
	for (i = 0; i < sz; i++)
	{
		*p = 1;
		p++; // p+1 跳过4个字节,直接操作第二个元素
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
	return 0;
}

二、指针 - 指针

  • 指针 - 指针, 就是两个指针之间元素的个数。
  • 指针 - 指针的前提条件是 指向同一个空间的2个指针才能相减。
c 复制代码
#include <stdio.h>

// 求字符数组的长度

// 1. 指针 - 指针求字符串长度
int my_strlen(char* p)
{
	char* start = p;
	while (*p != '\0')
	{
		p++;
	}
	return (p - start);
}
int main()
{
	int num = my_strlen("abcdef");

	printf("%d", num); // 6

	return 0;
}
---------------------------------------------------------------------------------
 // 2. 求字符串长度通过while循环计数
int my_strlen(char* p)
{
	int count = 0;
	while (*p != '\0')
	{
		count++;
		p++;
	}
	return count;
}
int main()
{
	int num = my_strlen("abcdef");

	printf("%d", num); // 6

	return 0;
}
-------------------------------------------------------------------------------------
// 3. 递归求字符串长度
int my_strlen(char* p)
{
	if (*p == '\0')
		return 0;
	else
		return 1 + my_strlen(p + 1);
}
int main()
{
	int num = my_strlen("abcdef");

	printf("%d", num); // 6

	return 0;
}
  • 指针加指针一般没有意义
  • 比如:
  • 日期加天数 -----有意义
  • 日期减天数 -----有意义
  • 日期减日期 -----有意义
  • 日期加日期 -----无意义

三、指针的关系运算

c 复制代码
#include <stdio.h>
#define N 5

int main()
{
	int* vp = NULL;

	int arr[N] = { 1,2,3,4,5 };
--------------------------------------------------------------------------------
	for (vp = &arr[N]; vp > &arr[0];) 
	{
		*--vp = 0;
	}
--------------------------------------------------------------------------------
	// N = 5 是 arr[4] 和 它后面的内存位置的指针进行比较
	int i = 0;
	for (i = 0; i < N; i++)
	{
		printf("%d", arr[i]); // 数组元素修改为0
	}
	return 0;
}

c 复制代码
#define N 5

int main()
{
	int* vp = NULL;

	int arr[N] = { 1,2,3,4,5 };
-----------------------------------------------------------------------------------------
	for (vp = &arr[N-1]; vp >= &arr[0]; vp--) 
	{
		*vp = 0;
	}
	// 这种写法 当 vp 为 0 的时候,是 arr[0] 和 它之前的内存位置指针比较
-----------------------------------------------------------------------------------------
	int i = 0;
	for (i = 0; i < N; i++)
	{
		printf("%d", arr[i]); // 数组元素修改为0
	}
	return 0;
}
  • 实际上绝大部分的编译器上两种都是可以顺利完成任务的,但是我们应该避免这种写法,因为表中并不保证它可行。
  • 标准规定:
  • 允许 指向数组元素的指针与指向数组最后一个元素后面 的哪个内存位置的指针 比较,但是不允许 与指向第一个元素之前 的那个内存位置的指针进行比较。

四、指针和数组

  • 指针就是用来存放地址的。
  • 数组就是一组相同类型的数值的组合。
  • 数组名一般情况下表示首元素地址。
  • 所以可以通过一下三种方法打印数组。
c 复制代码
#include <stdio.h>
void test(int* arr, int sz)
{
	int i = 0;
	int* p = arr; // 首元素地址存入指针变量 p
	for (i = 0; i < sz; i++)
	{
		printf("%d------------%d \n", *(arr + i), *(p + i));// 均可以打印出数组
		                              // arr 表示首元素地址, p 也表示首元素地址
	}
}

void test1(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]); // 打印数组
	}
}

int main()
{
	int arr[10] = { 0 };

	test(arr, 10);
	test1(arr, 10);
	return 0;
}

五、二级指针

  1. 一级指针
c 复制代码
int main()
{
	int a = 0;
	int* pa = &a; // 我们说,这里的pa 是一个一级指针
	*pa = 20;
	printf("%d", a);
	return 0;
}
  1. 二级指针
c 复制代码
int main()
{
	int a = 0;
	int* pa = &a; // 我们说,这里的pa 是一个一级指针
	
	// 此时获取a的地址存放到pa变量中
	// pa 变量是在内存中开辟了 4 个大小空间(32位)存放 a 的地址
	&pa; // 获取 pa 变量的地址
	int** ppa = &pa; // 获取 pa 的地址,在内存中申请大小为 4 的空间 ppa,存放pa地址
	// 这里的ppa就是一个二级指针
	
	**ppa = 20;
	// *ppa 指向变量 pa
	// **ppa 指向变量 a
	printf("%d", a);

    return 0;
}

六、指针数组

  • 存放指针的数组就是指针数组,本质上是一个数组。
c 复制代码
#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 30;

	int* parr[10] = { &a, &b, &c };

	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%d ", *parr[i]);
		// parr[i] <==> *(parr+i)
		// 以i = 0 来说明
		// 这里的*(parr+i)指向的是 &a
		// 再解引用指向 a
	}
	return 0;
}

指针数组可以将几个一维数组模拟成二维数组

c 复制代码
int main()
{
	int arr1[4] = { 1,2,3,4 };
	int arr2[4] = { 2,3,4,5 };
	int arr3[4] = { 3,4,5,6 };

	int* parr[10] = { &arr1, &arr2, &arr3 };

	int i = 0;

	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("%d ", parr[i][j]);
			// 这里 parr[i] <==> *(parr+i)
			// 
			// parr[i][j] <==> *(parr[i]+j) <==> *(*(parr+i)+j)
			// 以 i = 0 j = 0 为例
			// *(parr+i) 指向 &arr1
			// *(*(parr+i)+j) <==> *(&arr1) 指向 arr1 的首元素

		}
		printf("\n");
	}

	return 0;
}

总结

C语言指针±整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组等介绍,还包括指针数组将几个一维数组模拟为二维数组等的介绍。

相关推荐
是阿建吖!18 小时前
【Linux】信号
android·linux·c语言·c++
三品吉他手会点灯19 小时前
C语言学习笔记 - 43.运算符与表达式 - 运算符1 - 运算符的分类和简单介绍
c语言·笔记·学习·算法
wuminyu21 小时前
Java锁机制之轻量级锁判断与尝试逻辑源码剖析
java·linux·c语言·jvm·c++
老H科研技术1 天前
第 01 篇:MCP 概念与架构 —— AI 世界的“USB-C“
c语言·人工智能·chatgpt·架构·aigc·agi
社交怪人1 天前
【判断奇偶】信息学奥赛一本通C语言解法(题号1041)
c语言
Jun6261 天前
QT(1)-C/C++库生成和调用
c语言·开发语言·c++·qt
努力努力再努力wz1 天前
【Qt入门系列】一文掌握 Qt 常用显示类控件:QLCDNumber、QProgressBar 与 QCalendarWidget
c语言·开发语言·数据结构·数据库·c++·git·qt
C++ 老炮儿的技术栈1 天前
如何利用 OpenCV 将图像显示在对话框窗口上
c语言·c++·人工智能·qt·opencv·计算机视觉·github
yu85939581 天前
适合单片机和嵌入式系统的 C 语言 FIR 滤波器实现
c语言·单片机·mongodb
luj_17681 天前
马克思的跨学科学术体系
c语言·开发语言·c++·经验分享·算法