【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 ...
随机推荐
- win11 恢复Win10右键菜单的方法
1.Win+R运行CMD 2.输入:reg add HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocS ...
- RSA算法中,为什么需要的是两个素数?
PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. RSA算法中,为什么需要的是两个素数? RSA算法是一种广泛使用 ...
- vite+vue3+ts+elementPlus前端框架搭建 [一]
记录下搭建vite + vue3 + ts + elementPlus项目的过程及遇到的问题. 建议使用pnpm安装依赖,npm切换到pnpm 链接地址:[https://www.pnpm.cn/in ...
- format( )函数
在Python中,DETAIL_URL.format(id=id) 是一个字符串格式化的表达式.它通常用于根据一个已定义的字符串模板 DETAIL_URL 来生成一个新的字符串.在这个模板中,会包含一 ...
- ThreadLocal 源码浅析
前言 多线程在访问同一个共享变量时很可能会出现并发问题,特别是在多线程对共享变量进入写入时,那么除了加锁还有其他方法避免并发问题吗?本文将详细讲解 ThreadLocal 的使用及其源码. 一.什么是 ...
- 算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 决策树是一种简单直观的机器学习算法,它广泛应用于分类和回归问题中.它的核心思想是将复杂 ...
- Wireshark抓包分析理解DHCP协议及工作流程
一.DHCP简介 DHCP(Dynamic Host Configuration Protocol)动态主机配置协议,前身是BOOTP协议.在大型局域网中,需要给很多主机配置地址信息,如果采用传统 ...
- VPS测试脚本,网络线路,路由测试,流媒体服务器测试脚本
收集了一些服务器测试脚本,测试性能,网络以及解锁Netflix等服务.记录收集一下,特此记录. yabs测试脚本wget -qO- yabs.sh | bash 老外比较爱用的服务器性能测试脚本. ...
- Python生成PDF:Reportlab的六种使用方式
Reportlab是Python创建PDF文档的功能库 这里是整理过的六种Reportlab使用方式,主要参考的是<ReportLab User Guide> 一.使用文档模板DocTem ...
- 从DDPM到DDIM
从DDPM到DDIM (一) 现在网络上关于DDPM和DDIM的讲解有很多,但无论什么样的讲解,都不如自己推到一边来的痛快.笔者希望就这篇文章,从头到尾对扩散模型做一次完整的推导. DDPM是一个双向 ...