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语言复习》-指针

指针

重点

1.指针是什么

2.指针和指针类型

3.野指针

4.指针运算

5.指针和数组

6.二级指针

7.指针数组

1.指针是什么

指针就是地址,地址就是指针,意思是通过它能够找到以它为地址的内存单元

一个小的内存单元的大小是一个字节

对应32根地址线,有232个地址(232byte = 4G)

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

11111111 11111111 11111111 11111111

指针的大小都是4个字节

#include<stdio.h>
#include<string.h>

int main() {
	printf("%d", sizeof(int*));//4
	printf("%d", sizeof(char*));//4
	printf("%d", sizeof(double*));//4
	printf("%d", sizeof(float*));//4
}

那么指针类型又有什么意义呢?

指针类型决定了指针在解引用操作时,能够访问空间的大小

int *p 可以访问4个字节

char* p 可以访问1个字节

double *p 可以访问8个字节

野指针

1.野指针未初始化

#include<stdio.h>
int main() {
	int* p;//未初始化*p
	*p = 20;
	return 0;
}

2.指针越界访问

3.指针指向的空间已经被释放

如何避免野指针?
在使用前先判断if( p!=NULL),这里的p是地址

指针运算

指针±整数

#include<stdio.h>

int main() {
	int arr[] = { 1,2,3,4,5,6,7,8,9,10};
	int len = sizeof(arr) / sizeof(arr[0]);
	int i;
	//int* p = &arr;
	//for (i = 0; i < len; i++) {
	//	printf("%d\n", *p);
	//	p++;//p = p+1 //体现在这里
	//}
	
	int* p =&arr[9];
	for (i = 0; i < len; i++) {
		printf("%d\n", *p);
		p--;//p = p-1 //体现在这里
	}
}

体现的是地址的加加

#include<stdio.h>

int main() {
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	printf("%d\n", (&arr[9] - &arr[0]));//9
    printf("%d\n", (&arr[0] - &arr9));//-9
}

指针的相减一定指向的是同一块区域!也就是说,在同一个数组中才可以相加减,并且结果是中间相差的元素数(大减小,小减大是负数)

#include<stdio.h>
int my_strlen(char* arr) {
	char* start = arr;
	char* end = arr;//先初始化,不然像个野指针哈哈
	//因为字符串是[asdf\0]
	while (*end != '\0') {
		end++;
	}
	return end - start;
}
int main() {
	char arr[] = "asdf";
	int len;
	len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

第三种求strlen的方法,用的是指针加的运算,还有递归和循环的方法

注意点

arr不表示首地址的两种特殊的情况

#include<stdio.h>

int main() {
	int arr[10] = { 0 };
	printf("%p\n", arr);//00CFF910
	printf("%p\n", arr+1);//00CFF914

	printf("%p\n", &arr[0]);//00CFF910
	printf("%p\n", &arr[0]+1);//00CFF914

	printf("%p\n", &arr);//00CFF910
	printf("%p\n", &arr+1);//00CFF938 
	/*
	有两种取地址不是表示首元素的特殊情况
	1)&arr arr是数组名 取出的是整个数组的地址 12行我们也可以看出是加了 十六进制28 也就是 十进制32+8=40
	2)size(arr) 这里arr也是代表的整个数组,而不是首元素的地址
	*/
}

二级指针

#include<stdio.h>

int main() {
	int i = 10;
	int* pi = &i;
	int** ppi = &pi;//二级指针
	**ppi = 5;
	printf("i=%d,*pi=%d ,**ppi =%d", i, *pi, **ppi);//i=10,*pi=10 ,**ppi =10
	
}

指针数组

好孩子->好的孩子

指针数组->指针表示的数组

#include<stdio.h>

int main() {
	int a = 1;
	int b = 2;
	int c = 3;
	int* pA = &a;
	int* pB = &b;
	int* pC = &c;

	int* pArr[] = { &a,&b,&c };//这里等价于{pA,pB,pC}
	int i;
	for (i = 0; i < 3; i++) {
		printf("%d\n",*(pArr[i]));//第一种
		printf("%d\n", *(*(pArr + i)));//第二种
		printf("%d\n", **(pArr + i));//第三种
	}
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:15:53  更:2021-07-24 11:16:58 
 
开发: 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年5日历 -2024/5/8 2:32:09-

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