【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 ...
随机推荐
- maven常用命令大全(附详细解释)
1.常用打包命令 mvn clean package -Dmaven.test.skip=true -- 跳过单测打包mvn clean install -Dmaven.test.skip=true ...
- Nuxt3页面开发实战探索
title: Nuxt3页面开发实战探索 date: 2024/6/19 updated: 2024/6/19 author: cmdragon excerpt: 摘要:这篇文章是关于Nuxt3页面开 ...
- WebUI测试-获取html页面表格数据并存到Excel中
from selenium.webdriver.support import expected_conditions as EC import pandas as pd table=WebDriver ...
- 《编译原理》阅读笔记:p18
<编译原理>学习第 3 天,p18总结,总计 14页. 一.技术总结 1.assembler (1)计算机结构 要想学习汇编的时候更好的理解,要先了解计算机的结构,以下是本人学习汇编时总结 ...
- 3568F-麒麟KylinOS国产操作系统演示案例
- 继续我们的复习之路——webapi
前面断更几天是因为在住安心复习DOM BOM的内容 不得不说 还得是DOM 在这一章节的复习内容中 涌现出了很多又代表意义 经典的一些小案例 而且 还是有些难度的 有一两个我反正是自己独立完成不了 ...
- ubuntu16 python2 安装M2Crypto报错
正文 pip2 install M2Crypto # 报错: # unable to execute 'swig': No such file or directory # error: comman ...
- Docker的使用和常用命令
部署项目前基础服务准备 第一步:安装Docker环境 第二步:开启Docker远程带证书访问(可选) 第三步:拉取mysql,redis,nginx等等所需镜像 第四步:运行(创建)容器 # 本地远程 ...
- 火山引擎数智平台赋能火花思维,A/B测试加速创新
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群. 在数字化浪潮下,火花思维凭借其对数据驱动的理解与实践,搭上了业务快速增长的快车.这一效果的背后,离不开火花思 ...
- Java Redis多限流
Java Redis多限流 在Java中实现Redis多限流通常涉及使用Redis的某些特性,如INCR.EXPIRE.Lua脚本或者更高级的Redis数据结构如Redis Bitmaps.Redis ...