【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 ...
随机推荐
- Java BigInteger类和BigDecimal()类
BigInteger类 BigInteger 支持任意精度的整数,可以准确的表达任何大小的整数而不丢失精准度 BigInteger 位于 java.math包中 BigInteger()括号里必须是字 ...
- LeetCode 208. Implement Trie (Prefix Tree) 实现 Trie (前缀树)(C++/Java)
题目: Implement a trie with insert, search, and startsWith methods. Example: Trie trie = new Trie(); t ...
- C#.NET 4.8 WEBP 转 GIF
C#.NET 4.8 WEBP 转 GIF 项目是.NET 4.8. nuget 引用 Magick.NET-Q16-AnyCPU ,版本:7.14.5.高版本,如:12.2 已经不支持.NET FR ...
- EF EntityFramework 强制从数据库中取数据,而不是上下文
场景:插入了一条数据到数据库,这条数据会有其它程序修改,接着程序想获取最新数据.此时不加额外处理,取的仍是旧的. t_task ta = new t_task(); ta.item_id = item ...
- C#.NET Winform使用线程承载WCF (硬编码配置)
winform同步承载WCF时,遇到大量请求,可能会阻塞UI线程.这时就需要开个线程来承载WCF. 1.硬编码形式创建WCF服务,WCFServer类: using CommonUtils; usin ...
- 《Android开发卷——程序自动登录》
Android程序的自动登录功能 因为是公司的项目,所以这里不方便说出项目名称,这里就说我在做这个项目中用到的一些功能或者叫技术问题吧. 咱们经常用的Android程序中有一个情况,就是当你第一次注册 ...
- 内部网关协议RIP-路由选择协议
路由信息协议RIP(Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议,其相关标准文档为RFC1058. 一.RIP基本工作原理 RIP要求自治系统 ...
- CentOS7系统搭建web环境 php&nginx&pgsql
环境:VMware.CentOS-7-x86_64-DVD-2009.iso.nginx-1.26.1.php-7.2.0.postgresql-12 php最好安装对应php项目所需版本,否则会出现 ...
- 如何免费在 arm 官网上下载合适的手册
背景 有时候搞底层配置的时候(尤其是uboot),需要查阅文档. 这里介绍如何在arm 官网进行查找下载,这样就可以不用去 CSDN 了. 实际上CSDN上的一些文档就是这样下载下来二次收费的,强烈谴 ...
- 逆向通达信 x 逆向微信 x 逆向Qt
本篇在博客园地址https://www.cnblogs.com/bbqzsl/p/18252961 本篇内容包括: win32窗口嵌入Qt UI.反斗玩转signal-slot.最后 通达信 x 微信 ...