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 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 指针的进阶 -> 正文阅读

[C++知识库]指针的进阶

一、字符指针

一般的使用方式为:1.单个字符

#include <stdio.h>
int main()
{
	char h = 'A';
	char* pa = &h;
	return 0;
}

2.字符串

#include <stdio.h>
int main()
{
	char* pb = "abcdef";
    *pb = 'w';
    printf("%s",pb);
	return 0;
}

?pb里存放的是"abcdef"首字符 'a' 的地址

字符串常量 "abcdef"是存储在内存的只读数据区,不能通过指针对其修改,*pb='w' 表达错误,程序会挂掉。

很多编译器,在char*pb = "abcdef" 这里就会报警告

为了让代码更严谨,char*pb = "abcdef" 应改为 const?char*pb = "abcdef"?,把语法限制死,使这种写法一出现就会提醒自己。

?所以正确的代码风格写法:

#include <stdio.h>
int main()
{
	const char* pb = "abcdef";
	printf("%s\n", pb);
	return 0;
}

const修饰指针变量的作用:

1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变。

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 4;
	const int* p = &a;
	*p = 4;
	p = &b;
	return 0;
}

-----------------------------?*p不可修改,p可修改

2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 4;
    int* const p = &a;
	*p = 4;
	p = &b;
	return 0;
}

?------------------------*p可修改,p不可修改

3.*的左右都有const,则指针变量本身和指针变量的内容都不能修改。

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 4;
    const int* const p = &a;
	*p = 4;
	p = &b;
	return 0;
}

?----------------------*p和p都不能修改

《剑指offer》里有道题:求以下代码的输出结果

#include <stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	const char* arr3 = "abcdef";
	const char* arr4 = "abcdef";
	if (arr1 == arr2)
		printf("arr1 and arr2 are the same\n");
	else
		printf("arr1 and arr2 are not the same\n");

	if(arr3 == arr4)
		printf("arr3 and arr4 are the same\n");
	else
		printf("arr3 and arr4 are not the same\n");
	return 0;
}

arr1和arr2为数组,arr3和arr4为指针。它们的输出结果如下:

1.用相同的常量字符串去初始化 ,不同的数组的时候就会开辟出不同的内存块。arr1和arr2均为字符串首字符 ' a ' 的地址,但是两数组存放常量字符串 "abcdef" 的地址不同,所以arr1和arr2(实为首字符存放地址比较)自然不相等。
2.C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个常量字符串的时候,他们实际会指向同一块内存。这里arr3和arr4均为字符指针,指向的是同一个常量字符串。所以arr3和arr4所指向的首字符地址自然相同。

所以arr1和arr2不相同,arr3和arr4相同。


关键词typedefdefine的不同:

typedef int* pint;
#define PINT int*
#include <stdio.h>
int main()
{
	int* b, c;//相当于int* b,int c
	pint a, b;//相当于int* a,int* b
	PINT d, e;//相当于int *d,int e
	return 0;
}

typedef是创造一个新的类型,如int,char等类型。(如上代码,typedef创造出了一个新的类型pint,但是作用和int*一模一样)

#define是换了另一种表达方式来表达,相当于替换。(如上代码,用 PINT 来表示 int*)


二、指针数组

指针数组是一个存放指针的数组。

#include <stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 5,6,7,8,9 };
	int arr3[] = { 9,10,11,12,13 };
	int* arr[] = { arr1,arr2,arr3 };//数组里面全是指针
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);//arr[1][j]=arr1[j],相当于*(*(arr+1)+j)
		}
		printf("\n");
	}
	return 0;
}

运行结果:

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 12:51:59  更:2022-01-16 12:53:03 
 
开发: 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/24 11:13:59-

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