【C】Re06 数组与指针
一、指针和数组
void pointerAndArray() {
int array[5] = {1, 2, 3, 4, 5};
printf("pointer array -> %p\n", array);
printf("pointer *array -> %d\n", *array);
printf("pointer array + 1 -> %p\n", array + 1);
printf("pointer *array + 1 -> %d\n", *(array + 1));
// 访问数组首个元素的方式
printf("first element -> %d\n", array[0]);
printf("first element -> %d\n", *array);
// 如果是指定索引值的元素,就可以根据索引值推进
printf("index is 2 element -> %d\n", array[2]);
printf("index is 2 element -> %d\n", *(array + 2));
// 中括号的本质是 *(指针 + 推进值)
// 还可以索引值和指针交换书写 [不推荐这样书写]
printf("exchanged 3 -> %d\n", array[3]);
printf("exchanged 3 -> %d\n", 3[array]);
// 遍历
for (int i = 0; i < 5; ++i) {
printf("use [] -> %d, use *() -> %d\n", array[i], *(array + i));
}
// 数组解引用:
// &array[0] == &*(array + 0) == &*array == array;
// 注意,不要把指针当成绝对是数组的首个元素的索引
printf("this array byte size is -> %d\n", sizeof(array));
}
int main() {
pointerAndArray();
return 0;
}
二、通过指针操作数组
void usePointerControlArray () {
int array[5] = {5, 4, 3, 2, 1};
int * pointer = array;
for (int i = 0; i < 5 ; ++i) {
printf("array element -> %d, or use *() -> %d\n", pointer[i], *(pointer + i));
}
// p 和 array的区别?
printf("sizeof pointer -> %d\n", sizeof(pointer));
printf("sizeof array -> %d\n", sizeof(array));
// 使用负数非法访问数组,越界访问
printf("what is before the mem-value -> %d\n", array[-1]);
}
int main() {
usePointerControlArray();
return 0;
}
测验1:
void testPA() {
int array[5] = {1,2,3,4,5};
int * pointer = array;
printf("%d\n", *pointer ++); // 首先解析*p 然后p++ 运算
printf("%d\n", (*pointer) ++); // 首先解析*p 然后*p++ 运算
printf("%d\n", *(pointer ++)); // *pointer 推进 p++
for (int i = 0; i < 5; ++i) {
printf("array[%d] -> %d\n", i, array[i]);
}
}
int main() {
testPA();
return 0;
}
测验2:
void nestingUsage() {
int array[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n", array[*(array + *(array + array[3]))]);
}
int main() {
nestingUsage();
return 0;
}
三、指针数组
数组的每一个元素的数据类型为指针;
#include <stdio.h>
void pointerArray() {
int n1 = 10, n2 = 20, n3 = 30, n4 = 40;
int * arr[4] = {
&n1,
&n2,
&n3,
&n4
};
for (int i = 0; i < 4; ++i) {
printf("var-addr -> %p, var -> %d, use *() -> %d\n", arr[i], *arr[i], **(arr + i));
}
// -----------------------------------------------------------
char * array[4] = {"aaa", "bbb", "ccc", "ddd"};
int len = sizeof(array) / sizeof(char *);
for (int j = 0; j < len ; ++j) {
printf("%s\n", array[j]);
}
}
int main() {
pointerArray();
return 0;
}
四、指针运算
void operatePointer() {
int array[10] = {1,2,3,4,5,6,7,8,9,10};
int * p1 = array;
int * p2 = &array[4];
// printf("p1 + p2 = %d\n", p1 + p2); // 就算是同指针类型,也不能直接进行算术运算?
printf("p1 + p2 = %d\n", (int)p1 + (int)p2); // 将int指针类型强制转换成int类型 指针相加无意义
printf("p2 - p1 = %d\n", p2 - p1); // 指针相减有意义 ,可以获取到间隔的数值 也就是一开始的索引值
// 相乘无意义
// 相除无意义
// 判断运算
if (p1 == NULL) { // true 1 / false 0
// todo... 是空指针
} else {
// 不是空指针
}
}
int main() {
operatePointer();
return 0;
}
【C】Re06 数组与指针的更多相关文章
- 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...
- C语言核心之数组和指针详解
指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...
- 《征服 C 指针》摘录3:数组 与 指针
一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...
- C指针-数组和指针的归一
int bArr[] = {1,2,3}; int *iarr = bArr; *iarr = 6; printf("%d\n",*iarr); printf("%d\n ...
- 《C专家编程》第四章——令人震惊的事实:数组和指针并不相同
数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明 ...
- (C语言)数组与指针的区别
以前常常听过这种说法,说数组和指针这两者比较像,但是不能混淆,可是一直没能理解.刚刚在李云的<专业嵌入式软件开发>中,看了讲述数组与指针区别的一章,似乎有所领悟.本着知乎上看到的这张图,我 ...
- C语言教学--二维数组和指针的理解
对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...
- 【C语言学习】《C Primer Plus》第10章 数组和指针
学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...
- C语言学习004:数组与指针
在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的
- C语言--指向多维数组的指针和指针数组
#include <stdio.h> //void show(char *p[]); ]); int main(){ ][]={","abc","x ...
随机推荐
- 【AI应用开发全流程】使用AscendCL开发板完成模型推理
本文分享自华为云社区<[昇腾开发全流程]AscendCL开发板模型推理>,作者:沉迷sk. 前言 学会如何安装配置华为云ModelArts.开发板Atlas 200I DK A2.并打通一 ...
- Vue学习:21.mixins混入
在Vue中,mixins(混入)是一种用于分发Vue组件中可复用功能的灵活机制.它们允许你抽取组件中的共享功能,如数据.计算属性.方法.生命周期钩子等,并将其作为单独的模块复用到多个组件中.这种方式有 ...
- 比较 SpringSecurity 和 Shiro
相比 Spring Security, Shiro 在保持强大功能的同时,使用简单性和灵活性. SpringSecurity: 即使是一个一个简单的请求, 最少得经过它的 8 个Filter.Spri ...
- 写的程序总是出 BUG,只好请佛祖前来镇楼啦
前言 自己之前写着玩的,在这做个备份,感觉不错的取走即可. 南无阿弥陀佛 佛祖镇楼,BUG 消失,永不怠机. ///////////////////////////////////////////// ...
- MySql 增、删、改、查数据库
前言 之前几天写了MySql 的GROUP BY 语句和 JOIN 语句,今天补一下创建数据库.表的语句.首先假设已经暗转好MySQL 数据库,然后创建数据库.表. 创建数据库 create data ...
- es语法 rest api 模拟根据歌手,歌名,歌词来搜索demo
#创建索引songs_v1 PUT { - "acknowledged": true, "shards_acknowledged": true, "i ...
- 用 Visual C++ 2022 和 CMake 编译 CUnit 静态库
准备工作 源代码获取 CUnit 是知名的 C 语言单元测框架,其源代码最初发布在 sourceforge 上,网址为:https://sourceforge.net/projects/cunit/ ...
- Spark Structured Streaming(一)基础
1. 流处理的场景 我们在定义流处理时,会认为它处理的是对无止境的数据集的增量处理.不过对于这个定义来说,很难去与一些实际场景关联起来.在我们讨论流处理的优点与缺点时,先介绍一下流处理的常用场景. 通 ...
- 4.4K Star!推荐一款新一代的极简监控系统!轻量高性能!超500个监控指标,颜值高、功能强大!
在信息化快速发展的今天,企业运维面临的挑战日益增多.传统的运维监控系统往往存在功能冗余.性能低下.操作复杂等问题,难以满足现代企业对高效.稳定.智能的运维管理需求. 今天给大家推荐一款新一代极简运维监 ...
- Android 8.0 开机时间优化
Android 8.0 开机时间优化 背景 在嵌入式行业中,有些搭载 了Android系统的设备由于 开机时间 过长而导致无法被接受. 介绍 启动时间是系统性能的重要组成部分,因为用户必须等待启动完成 ...