一、二级指针:

变量 = 内存地址 + 存储值;

指针 = 内存地址 + 变量内存地址;

二级指针 = 内存地址 + 指针内存地址;

多级指针 = 内存地址 + 上一级内存地址;

void morePointer() {
int n = 190;
int * pointer = &n;
int ** pointerL2 = &pointer; printf("n -> %d\n", n);
printf("pointer -> %p\n", pointer);
printf("pointerL2 -> %p\n", pointerL2); printf("*pointerL2 == pointer == &n ? -> %d (1 true 0 false), *pointerL2 -> %p\n", *pointerL2 == pointer, *pointerL2);
printf("**pointerL2 == *pointer == n ? -> %d (1 true 0 false), **pointerL2 -> %d\n", **pointerL2 == n, **pointerL2);
} int main() {
morePointer();
return 0;
}

二、参数传递

数据传递方式:

1、值传递

2、地址传递

// 使用值传递
void valueSwap(int n1, int n2) {
int temp = n1;
n1 = n2;
n2 = temp; printf("in function valueSwap n1 = %d, n2 = %d\n", n1, n2);
} // 使用地址传递
void addrSwap (int * n1, int * n2) {
int temp = *n1;
*n1 = *n2;
*n2 = temp;
printf("in function addrSwap a = %d, b = %d\n", *n1, *n2);
} void testForSwap() {
int a = 200;
int b = 100;
valueSwap(a, b);
printf("in function testForSwap a = %d, b = %d\n", a, b); addrSwap(&a, &b);
printf("in function testForSwap a = %d, b = %d\n", a, b);
} int main() {
testForSwap();
return 0;
}

三、数组名作为函数参数

一个需求,定义一个函数用来遍历传递进来的数组

void printArray(int * arr, int size) { // 使用指针,允许是变量地址,但也可以是数组名称
for (int i = 0; i < size; ++i) {
printf("element -> (%d), and mem-addr -> %p\n", arr[i], &arr[i]);
} printf("sizeof is pointer or array itself ? -> %d\n", sizeof(arr));
} // 为了明确参数传递的是什么数据,建议是数组就传递数组
void printArrayV2(int array[], int length) {
for (int i = 0; i < length; ++i) {
printf("element -> (%d), and mem-addr -> %p\n", array[i], &array[i]);
} printf("sizeof is pointer or array itself ? -> %d\n", sizeof(array));
} // 封装获取数组长度的方法
int getSize(int array[]) {
return sizeof(array) / sizeof(int);
} // 封装数组遍历的方法:
void printArrayV3(int array[]) {
for (int i = 0; i < getSize(array) ; ++i) {
printf("el -> %d, mem-addr -> %p\n", array[i], &array[i]);
}
printf("sizeof is pointer or array itself ? -> %d\n", sizeof(array));
} int main() {
int array[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
printArray(array, 10); printf("sizeof is pointer or array itself ? -> %d\n", sizeof(array)); int array2[9] = { 2 };
printArrayV2(array2, sizeof(array2) / sizeof(int));
printf("sizeof is pointer or array itself ? -> %d\n", sizeof(array2)); int array3[3] = { 100 };
printArrayV3(array3);
printf("sizeof is pointer or array itself ? -> %d\n", sizeof(array3));
return 0;
}

四、指针做函数的返回类型

// 定义一个全局变量
int g_a = 100; int * returnTypeUsage() {
int a = 100; // 定义局部变量 {
int a = 100; // 代码块中的局部变量 {
int a = 100; // 块中块的局部变量
}
}
} // 封装一个获取地址的函数
int* getMemAddr() {
return &g_a;
} int main() {
int *p = getMemAddr(); *p = 33000; printf("g_a -> %d\n", g_a);
return 0;
}

【C】Re07 二级指针,指针与参数的更多相关文章

  1. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  2. C++ 二维数组(双重指针作为函数参数)

    本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851 http://blog.csdn.net/xudongdong ...

  3. Day8 函数指针做函数参数

    课堂笔记 课程回顾         多态 virtual关键字 纯虚函数 virtual func() = 0;         提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...

  4. go语言基础之数组指针做函数参数

    1.数组指针做函数参数 示例: package main //必须有个main包 import "fmt" //p指向实现数组a,它是指向数组,它是数组指针 //*p代表指针所指向 ...

  5. go语言基础之指针做函数参数用地址传递

    1.指针做函数参数 示例: package main //必须有个main包 import "fmt" func swap(p1, p2 *int) { *p1, *p2 = *p ...

  6. go语言基础之指针做函数参数

    1.指针做函数参数 示例: package main //必须有个main包 import "fmt" func swap(a, b int) { a, b = b, a fmt. ...

  7. [编程] C语言结构体指针作为函数参数

    结构体指针作为函数参数:结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针.如果结构体成员较多,尤其是成员为数组时,传送的时间和空间 ...

  8. c++中指针作为函数参数的详细理解

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着 ...

  9. 深入理解指针—>指针函数与函数指针的区别

    一. 在学习过程中发现这"指针函数"与"函数指针"容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数, ...

  10. C_C++指针指针应用详解

    前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其 ...

随机推荐

  1. vue带有参数的路由跳转 动态路由

    先定义好路由在router文件下面创建一个新的文件夹里面写上自己定义的路由 export default {   path: '/detail/:id',   component: () =>  ...

  2. LeetCode 449. Serialize and Deserialize BST 序列化和反序列化二叉搜索树 (Java)

    题目: Serialization is the process of converting a data structure or object into a sequence of bits so ...

  3. LeetCode 146. LRU CacheLRU缓存机制 (C++/Java)

    题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...

  4. Spring源码——AOP实现原理

    引言 Spring AOP(Aspect Orient Programming),AOP翻译过来就是面向切面编程,它体现的是一种编程思想,是对面向对象编程(OOP)的一种补充. 在实际业务开发过程中, ...

  5. java datetime数据类型去掉时分秒

    在Java中,如果我们想要表示一个日期而不包括时间(时分秒),我们通常会使用java.time包中的LocalDate类.LocalDate是一个不可变的日期对象,它只包含年.月.日三个字段. 1. ...

  6. 支撑阻力指标,庄家成本价是可靠的支撑位(无未来,DLL加密)

    本指标依据庄家的成本价设计的,庄家成本价是可靠的支撑位.底层逻辑:庄家是有内幕的, 庄家能在价格低位时抄底,庄家控股时,庄家不会让散户获取低价的筹码,所以当股价到达到支撑位时,会有比较大的反弹.庄家也 ...

  7. C++之printf函数

    背景 C++中可以使用cout来输出. 但是cout输出一些格式化的数据非常麻烦. 比如: hour,min和sec代表当前时间,需求:按12:00:00格式输出当前时间. //使用cout输出 co ...

  8. 蚁群算法及 TSP 问题上的应用

    群智能(Swarm intelligence) 自然界动物群,称之为群. 群的特征: 相互作用的相邻个体的集合 个体的行为简单,既有竞争又有协作 智能化的集体行为(1+1>2): 个体间不仅能够 ...

  9. 高通驱动树中的GPIO详解

    高通驱动树中的GPIO详解 reference:https://blog.csdn.net/baidu_37503452/article/details/80257441 Drive Strength ...

  10. koa web框架入门

    1.在hello-koa这个目录下创建一个package.json,这个文件描述了我们的hello-koa工程会用到哪些包.完整的文件内容如下: { "name": "h ...