一、二级指针:

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

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

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

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

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. 重写学习 localStorage 与 sessionStorage

    localStorage 与 sessionStorage localStorage 与 sessionStorage 很多小伙伴对它们俩都很熟悉了: 最熟悉的莫过下面这2条 1,localStora ...

  2. 实战 k8s----初识

    什么是k8s?k8s是谷歌开源的一套完整的容器管理平台,方便我们直接管理容器应用.谷歌称之为,kubernetes,[kubə'netis] ,(跟我一起读库波尔耐题思,重音在耐的音上),由于字母太多 ...

  3. Spring扩展——BeanFactory和FactoryBean

    BeanFactory和FactoryBean BeanFactory和FactoryBean长得很相似,也很容易让我们产生误解,特别是对于初学者而言,搞懂他俩关系非常有必要,因为这两个接口,是Spr ...

  4. scrapy爬取知名问答网站

    scrapy爬取知名问答网站 分析及数据表设计 itemloader方式提取question spider爬虫逻辑的实现以及answer的提取 保存数据到mysql中

  5. CSS 属性计算

    CSS 属性计算过程 你是否了解 CSS 的属性计算过程呢? 有的同学可能会讲,CSS属性我倒是知道,例如: p{ color : red; } 上面的 CSS 代码中,p 是元素选择器,color ...

  6. STM32 CubeMX 学习:004-PWM

    背景 上一讲,我们介绍了 STM32 CubeMX 学习:定时器 ,并示范了如何使用定时器来定时.这一讲我们来试试PWM(Pulse Width Modulation, 脉冲宽度调制),这是利用微处理 ...

  7. .NET周刊【6月第4期 2024-06-23】

    国内文章 C#.Net筑基-集合知识全解 https://www.cnblogs.com/anding/p/18229596 .Net中提供了数组.列表.字典等多种集合类型,分为泛型和非泛型集合.泛型 ...

  8. python基础-字典dict {key:value }

    字典的定义和操作 字典的特性: 元素数量 支持多个 元素类型 key :value key:除字典外的任何类型 Value:任何类型 下标索引 不支持 重复元素 key不支持 可修改性 支持 数据有序 ...

  9. T3/A40i升级,推荐全志T507-H的5个理由!

    作为能源电力.工业自动化领域的国产中坚力量,全志T3/A40i处理器国产平台一直深受广大客户的喜爱,甚有"国产工业鼻祖处理器"之称.自创龙科技推出T3/A40i全国产工业核心板(S ...

  10. Nunjucks

    Nunjucks是什么东东?其实它是一个模板引擎. 那什么是模板引擎? 模板引擎就是基于模板配合数据构造出字符串输出的一个组件.比如下面的函数就是一个模板引擎: function examResult ...