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语言从入门到精通——指针基础 -> 正文阅读

[C++知识库]C语言从入门到精通——指针基础

指针和内存单元

指针: 地址。

内存单元: 计算机中内存最小的存储单位。——内存单元。大小一个字节。 每一个内存单元都有一个唯一的编号(数)。

	   称这个内存单元的编号为 “地址”。

指针变量:存地址的变量。

指针定义和使用:

int a = 10;

int *p = &a;			int* p;--- windows;	int *p ---Linux       int * p ;

int a, *p, *q, b;

*p = 250;			指针的 解引用。 间接引用。

*p : 将p变量的内容取出,当成地址看待,找到该地址对应的内存空间。

	如果做左值: 存数据到空间中。

	如果做右值: 取出空间中的内容。


任意“指针”类型大小:

	指针的大小与类型 无关。 只与当前使用的平台架构有关。   32位:4字节。	 64位: 8字节。
using namespace std;
int main() {
    int a=10;
    int *p = &a;
    printf("指针地址%d\n",p);
    printf("存指针地址:%d\n",&p);
    printf("解引用:%d\n",*p);
    printf("a的地址%d\n",&a);
    return 0;
}

野指针:
1) 没有一个有效的地址空间的指针。

	int *p;

	*p = 1000;

2)p变量有一个值,但该值不是可访问的内存区域。
	
	int *p = 10;

	*p = 2000;

【杜绝野指针】

空指针:
int *p = NULL; #define NULL ((void *)0)

*p 时 p所对应的存储空间一定是一个 无效的访问区域。

万能指针/泛型指针(void *):

可以接收任意一种变量地址。但是,在使用【必须】借助“强转”具体化数据类型。

	char ch = 'R';

	void *p;  // 万能指针、泛型指针
	
	p = &ch;

	printf("%c\n", *(char *)p);

const关键字:

修饰变量:

const int a = 20;

int *p = &a;

*p = 650;

printf("%d\n", a);


修饰指针:
const int *p;
	可以修改 p
	不可以修改 *p。
int const *p;
	同上。
int * const p;
	可以修改 *p
	不可以修改 p。
const int *const p;
	不可以修改 p。
	不可以修改 *p。
总结:const 向右修饰,被修饰的部分即为只读。
常用:在函数形参内,用来限制指针所对应的内存空间为只读。

指针和数组:

数组名:  
	【数组名是地址常量】 --- 不可以被赋值。	 ++ / -- / += / -= / %= / /=  (带有副作用的运算符)

	指针是变量。可以用数组名给指针赋值。 ++ -- 

取数组元素:

	int arr[] = {1,3, 5, 7, 8};

	int *p = arr;  

	arr[i] == *(arr+0) == p[0] == *(p+0)

指针和数组区别:

	1. 指针是变量。数组名为常量。

	2. sizeof(指针) ===》 4字节 / 8字节

	   sizeof(数组) ===》 数组的实际字节数。

指针++ 操作数组:

	int arr[] = { 1, 2, 4, 5, 6, 7, 8, 9, 0 };
	int *p = arr;		

	for (size_t i = 0; i < n; i++)
	{
		printf("%d ", *p);
		p++;  // p = p+1;   一次加过一个int大小。 一个元素。
	}

	p的值会随着循环不断变化。打印结束后,p指向一块无效地址空间(野指针)。

指针加减运算:
数据类型对指针的作用:

	1)间接引用:
		决定了从指针存储的地址开始,向后读取的字节数。  (与指针本身存储空间无关。)
	2)加减运算:
		决定了指针进行 +1/-1 操作向后加过的 字节数。
指针 * / % : error!!!
指针 +- 整数:
	1) 普通指针变量+-整数
		char *p; 打印 p 、 p+1  偏过 1 字节。
		short*p; 打印 p 、 p+1  偏过 2 字节。
		int  *p; 打印 p 、 p+1  偏过 4 字节。		
	2)在数组中+- 整数
		short arr[] = {1, 3, 5, 8};
		int *p = arr;
		p+3;			// 向右(后)偏过 3 个元素
		p-2;			// 向前(左)偏过 2 个元素
	3)&数组名 + 1
		加过一个 数组的大小(数组元素个数 x sizeof(数组元素类型))
指针 +- 指针:
	指针 + 指针: error!!!
	指针 - 指针:
		1) 普通变量来说, 语法允许。无实际意义。【了解】

		2) 数组来说:偏移过的元素个数。
#include <iostream>
using namespace std;
int main() {
    int a[]= {3,2};
    int *p = a;
    printf("指针地址%d\n",p);
    printf("存指针地址:%d\n",&(p));
    printf("解引用:%d\n",*p);
    printf("a的地址%d\n",&a);
    printf("存指针地址:%d\n",*(p+1));
    return 0;
}

指针实现 strlen 函数:
char str[] = “hello”;
char *p = str;
while (*p != ‘\0’)
{
p++;
}
p-str; 即为 数组有效元素的个数。
指针比较运算:

1) 普通变量来说, 语法允许。无实际意义。
2) 数组来说:	地址之间可以进行比较大小。
		可以得到,元素存储的先后顺序。
3) int *p;
    p = NULL;		// 这两行等价于: int *p = NULL;
    if (p != NULL)
	printf(" p is not NULL");
    else 
	printf(" p is NULL");

指针数组:
一个存储地址的数组。数组内部所有元素都是地址。
1)
int a = 10;
int b = 20;
int c = 30;

	int *arr[] = {&a, &b, &c}; // 数组元素为 整型变量 地址
2) 

	int a[] = { 10 };
	int b[] = { 20 };
	int c[] = { 30 };

	int *arr[] = { a, b, c }; // 数组元素为 数组 地址。	

指针数组本质,是一个二级指针。

二维数组, 也是一个二级指针。

多级指针:
int a = 0;

int *p = &a;  				一级指针是 变量的地址。

int **pp = &p;				二级指针是 一级指针的地址。

int ***ppp = &pp;			三级指针是 二级指针的地址。	

int ****pppp = &ppp;			四级指针是 三级指针的地址。	【了解】

多级指针,不能  跳跃定义!
对应关系:
ppp == &pp;			三级指针	
*ppp == pp == &p; 			二级指针
**ppp == *pp == p == &a				一级指针
***ppp == **pp == *p == a				普通整型变量
*p : 将p变量的内容取出,当成地址看待,找到该地址对应的内存空间。
	如果做左值: 存数据到空间中。
	如果做右值: 取出空间中的内容。

===================================================================================================================================
指针和函数:
传值和传址:
指针做函数参数:
数组做函数参数:
指针做函数返回值:
数组做函数返回值:

?

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

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