Skip to main content

moregeek program

40篇学完C语言——(第四篇)【指针与地址】-多极客编程

前言


指针其实很简单。同C语言中其他变量一样,把指针也看成是一种变量即可,这种变量专门存储地址值


int a = 100;
int* b = &a;

上面的代码很清晰,a是一个整形变量,值为100;b是一个指针变量,值是变量a的地址。变量和指针的类型必须相同。


本文主要讲利用指针变量如何读写地址中的值。


正文


1、首先来假设一个场景:交换a和b两个变量的值。看下面的例子:


void swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
void change()
{
int a = 100;
int b = 200;
swap(a, b);
}

结果a,b的值并没有交换成功。原因是:C程序在调用函数时使用“按值调用”,这意味着变量的值直接从调用函数复制到被调函数的实参中,“按值调用”是C语言中调用函数的唯一方式。


2、C通过创建指针的方式解决上述问题。
尽管声明指针变量的形式稍微复杂一点点,指针就是个保存变量地址的变量而已。指针常见操作如下:


第一类:创建指针变量,“ 基本类型+ * ”。


int* iptr;
char* cptr;
double* dptr;

第二类:给指针变量赋值,“ &+变量 ”。


int a = 100;
char b = 'o';
double c = 100.5;

int* iptr;
char* cptr;
double* dptr;

iptr = &a;
cptr = &b;
dptr = &c;

第三类:取指针变量保存的地址中的值,“ * + 指针变量”。


int a = 100;
int* iptr = &a;
int b = *iptr;

于是,上面的代码改写成:


void swap(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
void change()
{
int a = 100;
int b = 200;
swap(&a, &b);
}

3、一个函数只能访问自己的栈帧。
但是,通过指针,一个函数可以间接地读写另一个栈帧中的变量值。
值得注意的是,函数之间利用指针读写是有方向的。如果函数F1调用F2,则F2可以读写F1中的变量值,反之不行。很好理解,F2得栈帧先出栈,出栈后变量都没有了,F1还读写什么呢?


总结


指针并不难。

©著作权归作者所有:来自51CTO博客作者xcc_21的原创作品,请联系作者获取转载授权,否则将追究法律责任
40篇学完C语言——(第四篇)【指针与地址】
https://blog.51cto.com/u_15389321/5340012

C++从虚表地址中取内容-多极客编程

开局一张图从地址中,调用虚表中的函数,上图!1、定义父类指针地址,申请子类内存空间cParent *cp = new cSon;2、获取虚表的首地址cp          指针变量int*        强转为int类型* 再取*,表示取虚表的首地址为什么​​*​​是取虚表呢,因为cp指针变量本身就是父类地址申请的子类空间,就是虚析构*(int*)cp3、虚表首地址取到了,接下来该取虚表中的第一个

[ C语言练习题 ]字符串逆序,使用指针,写一个函数,可以逆序字符串的内容。-多极客编程

指针练习题 题目:字符串逆序 内容与要求:使用指针,写一个函数,可以逆序一个字符串的内容。举例: 输入: I Love You. 输出: .uoY evoL I   输入: abc 输出: cba实现代码:#include #include int My_strlen(char* s){ //求长度 指针减指针的方法求长度 char* start = s; while (*s != '\0'

刨析《C语言》进阶付费知识【完结】-多极客编程

@[toc] 动态内存开辟 malloc 只是从内存池中提取一块合适的内存,并不会初始化,如果需要初始化,要么手动,要么使用calloc函数 动态开辟的空间,2种收回方式 主动释放 程序结束 对NULL指针的解引用if(p==NULL) { printf("错误"); return ; } 对动态开辟空间的内存越界访问 使用free释放非动态开辟的空间 使用free释放动态的内存中的一部分 对

[ C语言练习题 ] 青蛙跳台阶问题,小乐乐走台阶问题-多极客编程

题目来源:https://www.nowcoder.com/practice/ebf04de0e02c486099d78b7c3aaec255?tpId=107&&tqId=33398&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking​描述小乐乐上课需

[C语言练习题 ]把一个数的奇数位变成1,偶数位变成0,怎么写?-多极客编程

题目来源:https://www.nowcoder.com/practice/fcd30aac9c4f4028b23919a0c649824d?tpId=107&&tqId=33397&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking描述小乐乐喜欢数字

40篇学完C语言——(第五篇)【指针与函数参数】-多极客编程

指针变量作为函数参数    函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。 栗子: 对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。 #include <stdio.h> int main() { void swap(int *p1,int *p2); //对swap函数的声明

C++从虚表地址中取内容-多极客编程

开局一张图从地址中,调用虚表中的函数,上图!1、定义父类指针地址,申请子类内存空间cParent *cp = new cSon;2、获取虚表的首地址cp          指针变量int*        强转为int类型* 再取*,表示取虚表的首地址为什么​​*​​是取虚表呢,因为cp指针变量本身就是父类地址申请的子类空间,就是虚析构*(int*)cp3、虚表首地址取到了,接下来该取虚表中的第一个

详细教程:在C#/VB.NET中如何创建图片超链接-多极客编程

超链接(Hyperlink)可以看做是一个“热点”,它可以从当前Web页定义的位置跳转到其他位置,包括当前页的某个位置、Internet、本地硬盘或局域网上的其他文件,甚至跳转到声音、图片等多媒体文件。浏览Web页是超链接最普遍的一种应用,通过超链接还可以获得不同形态的服务,如文件传输、资料查询、电子函件、远程访问等。我们可以直接在Word中对文字或图片添加超链接,本文将通过C#/VB.NET程序

C#/VB.NET 获取Excel中的表单控件-多极客编程

Excel中可通过【开发工具】菜单栏下插入表单控件,如文本框、单选按钮、复选框、组合框等等,插入后的控件可执行设置控件格式,如大小、是否锁定、位置、可选文字、数据源区域、单元格链接等。当Excel中已插入上述控件,需要读取时,也可以使用本文中的方法来读取。下面,将通过C#及VB.NET代码示例展示如何来获取Excel文档中的表单控件。以下是读取的方法及步骤,供参考。【引用dll】方法1:在程序中手

Docker下RabbitMQ四部曲之三:细说java开发-多极客编程

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是《Docker下RabbitMQ四部曲》系列的第三篇,实战两个基于SpringBoot的工程,分别用来生产和消费RabbitMQ消息; 前文链接 前两章的内容是体验RabbitMQ服务,以及制作RabbitMQ镜像: 《Docker下Rabbi

[ C语言练习题 ] 青蛙跳台阶问题,小乐乐走台阶问题-多极客编程

题目来源:https://www.nowcoder.com/practice/ebf04de0e02c486099d78b7c3aaec255?tpId=107&&tqId=33398&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking​描述小乐乐上课需

#yyds干货盘点# 解决剑指offer:和为S的两个数字-多极客编程

1.简述:描述输入一个升序数组 array 和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。示例1输入:[1,2,4,7,11,15],15返回值:[4,11]说明:返回[4,11]或者[11,4]都是可以的示例2输入:[1,5,11],10返回值:[]说明:不存在,返回空数组示例3输入:[1,2,3,