IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 这篇文章可能是你最期待的高级指针话题 -> 正文阅读

[数据结构与算法]这篇文章可能是你最期待的高级指针话题

待更新中.............

字符指针

字符指针:指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。

存放字符的字符指针

#include<stdio.h>
int main()
{
	char ch = 'w';//(1)
	char* pc = &ch;//(2)
	*pc = 'w';//(3)
	return 0;
}
  • 1):开辟char类型变量为ch内存空间存放一个字符w;
  • 2):将字符w地址存放在指针变量pc中(此时pc就是存放字符的指针也叫作字符指针
  • 3):pc解引用找到字符w

存放字符串的字符指针

int main()
{
 ? ?char* p = "hello world";//存放字符串的字符指针
 ? ?printf("%s\n", p);
 ? ?return 0; 
}
  • 这里是把一个字符串放到pstr指针变量里了吗?

答案是否定的。字符串的指针:当一个字符串常量出现在表达式中时,它的值是个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针

  • 为啥是指向第一个字符的指针呢?、

因为"hello,bit"这里是一个字符串常量是存在只读存储区的,地址存在于在进程的?text?段,text?段除了保存常量还保存可执行代码,因此是不允许可写权限的,而是只允许可读可执行权限,内容不可改,所以,当指针指向这个字符串的时候,它指向的是字符串的首字符的地址,也就是第一个字符的地址。具体写这一行代码正确写法应该是:const char*p = "hello,world";(也正好吻合了指针指向的内容不可以改变)。

  • 举个小例子来简单理解上面内容(这里是c和指针这本书的内容)

"xyz"+1,这个意思指针指向的是第一个字符的地址,加上1就是下一个字符的地址也就是y

*("xyz")指针指向的是第一个字符的地址解引用就是第一个字符也就是x

"xyz"[2]这个就是指向下标为2的字符也就是z

字符串的指针与字符数组比较

字符数组:当数组名用于表达式中时,它们的值也是个指针常量。我们可以对它们进行下标引用、间接访问以及指针运算。

int main()
{
 ? ?char p[] = "hello world";//存放字符串的字符数组

 ? ?return 0; 
}

所有char字符都连续的存放在栈区。内容可更改!(也就是数组是存放在栈区上的而与字符串指针不一样它是存放在制度存储区的内容不可改)。

🎯来道笔试题

#include <stdio.h>
int main()
{
 ? ?char str1[] = "hello bit.";
 ? ?char str2[] = "hello bit.";
 ? ?const char *str3 = "hello bit.";
 ? ?const char *str4 = "hello bit.";
 ? ?if(str1 ==str2)
 printf("str1 and str2 are same\n");
 ? ?else
 printf("str1 and str2 are not same\n");
 ? ? ? 
 ? ?if(str3 ==str4)
 printf("str3 and str4 are same\n");
 ? ?else
 printf("str3 and str4 are not same\n");
 ? ? ? 
 ? ?return 0; }

先说str1和str2:

?

str3与str4:

因为str3和str4常量指针所指向的是常量字符串,常量字符串存储到单独的一个内存区域,当 几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块

?

指针数组

指针数组是一个存放指针的数组。
整形指针数组:int* arr1 [ 4 ]
#include<stdio.h>
int main()
{
	int arr1[4] = { 1,2,3,4 };
	int arr2[4] = { 2,3,4,5 };
	int arr3[4] = { 3,4,5,6 };
	int* arr[3] = { arr1,arr2,arr3 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("%d ", arr[i][j]);
			printf("%d ", *(*(arr + i) + j));
			//arr[i][j]<==>*(*(arr + i) + j)
		}
		printf("\n");
	}
	return 0;
}

这里的得arr是指针数组,存放指针的数组,数组名是首元素地址,又因为指针就是地址,所以arr指针数组存放着三个数组首元素地址,当访问数组时访问的是这个数组的首元素地址,又因为数组在内存中是连续存放的,我们只要有首元素地址就可以访问一个数组中的所有元素。

?一级字符指针的数组:char* arr2[4]

#include<stdio.h>
int main()
{
//通过字符指针数组访问
	char *str[] = { "zhangsan","lisi","wangerma" };
	int sz = sizeof(str) / sizeof(str[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%s ", str[i]);
	}
	return 0;
}

?二级字符指针的数组:char** arr3[5]

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:19:22  更:2022-01-16 13:19:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:48:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码