【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 ...
随机推荐
- 代码审计——基础(JAVAWEB)
JAVAWEB 目录 JAVAWEB Servlet技术 JavaWeb概述 Servelt与Servlet容器 Servlet概念 Tomcat Web程序结构 Servlet容器响应客户请求的过程 ...
- Selenium模块的使用(二)
selenium处理iframe - 如果定位的标签存在于iframe标签之中,则必须使用switch_to.frame(id) - 动作链(拖动):from selenium.webdriver i ...
- [TinyRenderer] Chapter1 p3 Line
(注:本小节不是对划线算法事无巨细的证明,如果你需要更加系统的学习,请跳转至文末的参考部分) 如果你是一名曾经学习过图形学基础的学生,那么你一定对画线算法稔熟于心,中点划线算法,Bresenham算法 ...
- github fork后对上游仓库的做rebase
想对上游仓库做更新同步 先添加上游仓库 git remote add upstream https://github.com/原始作者/原始仓库.git 其中这里的upstream 是一个命名,和 o ...
- 订单号规则,不能重复。redis去重 redis集合set应用
订单号规则,不能重复.redis去重 redis集合set应用 redis锁定商品解决并发售卖问题 RedisUtil工具类https://www.cnblogs.com/oktokeep/p/179 ...
- 用cvCvtColor转化RGB彩色图像为灰度图像时发生的小失误
版本信息 MAC版本:10.10.5 Xcode版本:7.2 openCV版本:2.4.13 在运行程序的时候发现cvCvtColor的地方程序报错 error: (-215) src.depth() ...
- Nuxt3 的生命周期和钩子函数(八)
title: Nuxt3 的生命周期和钩子函数(八) date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要:本文介绍了Nuxt ...
- 3568F-Qt工程编译说明
- SpringBoot连接数据库的方式
1.Spring集成的服务 直接通过注入方式使用,如redis,jdbc等等服务. spring: redis: host: localhost port: 6379 password: 123456 ...
- const isProduction = process.env.NODE_ENV === 'production'; 作用
一. process 要理解 process.env.NODE_ENV 就必须要了解 process,process 是 node 的全局变量,并且 process 有 env 这个属性, 但是没有 ...