指针

Linux-C P8 函数

有些话、适合烂在心里 提交于 2020-01-18 05:37:05
文章目录 Linux-C P8 函数 函数基础 声明与定义 运作原理 main函数的参数 函数和数组 传递数组 传递指针 指针函数 定义与声明 函数使用 函数指针 定义与声明 函数使用 函数指针数组 递归与回调 递归函数 回调函数 attribute机制 C语言库函数 头文件 库函数 新系列预告 更多内容 Linux-C P8 函数 本文主要讲解有关C语言函数的功能,包括函数的概念和 基本使用 , 函数与数组 、 指针函数 、 函数指针 ;学会了有关 递归 与 回调 的相关知识点;并了解GNU C的 attribute机制 和 库函数 函数基础 在学会如何使用函数之前,先来看看函数是什么,如何被 定义 ,函数的 运作原理 以及 main函数参数 的使用 声明与定义 什么是函数? 函数 是一个能完成特点功能的代码 模块 每个C程序都至少有一个函数,即主函数 mian() ,所有简单的程序都可以定义其额外的函数 可以把 代码 划分到不同的 函数 中,如何划分由自己决定;但在逻辑上,划分通常是根据每个函数执行一个 特定的任务 来进行的 为什么要定义函数? 1.随着程序 规模的变大 ,会让main函数的内容变得 相当长且不易处理 、 可读性差 等问题 2.程序 复杂不断提高 ,代码前后 关联太强 ,不具有好的移植和扩展性 3.还有 代码重复 的等等问题

浅谈c语言的指针

≡放荡痞女 提交于 2020-01-18 05:12:14
对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了。c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分。 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据是地址。地址又是什么概念?每一段内存都有其相应的地址,用街道来比喻的话,地址就是门牌号,数据就储存在家里。指针变量的作用就是储存门牌号。 定义一个指针变量要加一个*号。这里要提及两个概念,指针的类型和指针指向的类型。首先来说一下指针的类型。一般来说,指针类型要与指针指向的类型相匹配,不匹配的话往往会有警告。但是指针类型可以不匹配指针指向的类型。指针类型可以是用原本存在的类型如int *,char *,也可以自己定义,如结构体指针等。我认为定义指针类型目的就是确定指针的步长,即对指针变量进行p++操作时,p的数据加了几个字节。如int *p进行p++时,p的数据加了四个字节(对于32位系统),因为int型占的内存就是4个字节。所以同样的,char *p进行p++操作时,p的数据加了一个字节。同样的,定义一个占20个字节的结构体stu,那么stu *p的p++里面数据增加20个字节。所以就可以用char *p来访问int类型中每一个字节的数据。程序和运行结果如下: 所以可以通过这样的方法来访问int定义的i中每一个字节所存储的内容,也可以通过这样的方法确定大小端。

Record20—二级指针的输出模型

蓝咒 提交于 2020-01-18 03:11:45
目录 二级指针作输出模型 总体代码 二级指针作输出模型 指针做输出:被调用函数分配内存 下面这个例子,就是一个使用二级指针作输出的典型例子: int getMem(char **myp1, int *mylen1, char **myp2, int *mylen2) { char *tmp1 = NULL; char *tmp2 = NULL; tmp1 = (char *)malloc(100); if (tmp1 == NULL) { return -1; } strcpy(tmp1, "abcdefg"); *mylen1 = strlen(tmp1); *myp1 = tmp1; //间接修改实参p1的值 tmp2 = (char *)malloc(100); if (tmp2 == NULL) { return -2; } strcpy(tmp2, "11122233333"); *mylen2 = strlen(tmp2); *myp2 = tmp2; //间接修改实参p1的值 return 0; } int getMem_Free(char **myp1) { /* if (myp1 == NULL) { return ; } free(*myp1); //释放完指针变量 所致的内存空间 *myp1 = NULL; //把实参修改成nULL */ char *tmp

对象的动态建立和释放

元气小坏坏 提交于 2020-01-17 21:28:27
1 new 和 delete基本语法 1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。 注意: new 和 delete 是运算符,不是函数,因此执行效率高。 2 )虽然为了与 C 语言兼容, C++ 仍保留 malloc 和 free 函数,但建议用户不用 malloc 和 free 函数,而用 new 和 delete 运算符。 new运算符的例子: new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针) new int(100); //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址 new char[10]; //开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址 new int[5][4]; //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址 float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p 3)new和delete运算符使用的一般格式为: 用 new

文件流、指针偏移、流状态位 与圣经文件练习

一个人想着一个人 提交于 2020-01-17 19:23:53
文件流、指针偏移、流状态位与圣经文件练习 一.文件流 在文件流中, 定义的类型有: fstream 既可以是输入流也可以是输出流 ifstream 输入流 ofstream 输出流 在对文件进行操作前,需要以open的形式打开,第一个参数是filename, 第二个参数是mode mode 含义 ios::in 读方式 ios::out 写方式 ios::app 一般结合写方式,在文末尾进行追加 ios::ate 一般结合读方式,指针跳到末尾 ios::trunc 以截断方式打开,也就是将文件长度变为0 注意: 1.当定义 ifstream 时, 默认以 ios::in 打开; 2.当定义 ofstream 时, 默认以 ios::out|ios::trunc 打开; 向文本中写数据 //尝试向文本中写数据 void Write ( ) { ofstream fout ; fout . open ( "data.txt" , ios :: out | ios :: trunc ) ; //即使不写,ofstream生成的默认mode也是ios::|ios::trunc fout << "name:wk" << " age:21" << endl ; ofstream fout2 ; fout2 . open ( "data.txt" , ios :: app ) ; fout2 <

C++堆指针栈指针

 ̄綄美尐妖づ 提交于 2020-01-17 16:51:22
C++堆指针栈指针 指针是一种灵活高效的内存访问机制。 按有无申请动态分配的方式,分为两种类别: 堆指针 、 栈指针 。 在程序中定义一个变量,它的值会被放入内存中。 如果 申请使用动态分配 ,它的值将放到 堆 中。 如果 没有申请动态分配 ,它的值将放到 栈 中。 tips:前提是定义了一个 空指针 。 1 、创建堆指针: 申请动态分配使用关键字 new 。 p = new type ; 其中,p表示指针,new是关键字,type是类型名。 new返回新分配的内存单元的地址。 指针函数: int * GetHeapsPoint ( int * p ) { p = new int ; //申请动态分配,令指针指向某个int型 int k1 = 111 ; * p = k1 ; //指向k1 return p ; } 可以看到指针p创建后申请了动态分配,程序自动交给他一块堆地址。 2 、创建栈指针: 指针函数: int * GetStackPoint ( int * i ) { int k2 = 222 ; i = & k2 ; //无动态分配,直接指向k2的地址 return i ; } 可以看到指针i则是获取了栈中k2的地址,属于静态分配。 3、动态内存的销毁: 动态分配方式虽然灵活,但是随之带来新的问题。申请一块堆内存后,系统不会再程序执行时依据情况自动销毁它。 若想释放该内存

引用 & 指针区别* int &a=b

落爺英雄遲暮 提交于 2020-01-17 10:12:25
参数里面的&表示引用型参数 一般的参数传递的时候,形参是实参的副本,也就是说,形参虽然和实参一样,但是在内存中的位置不同 而引用型参数,在函数参数传递的时候,并不要复制参数,形参和实参在内存中是同一个位置,因此修改形参,实参也变化了 & 这里表示引用,说明需要传递变量给这个函数,函数中可以对参数的值进行修改 如果没有 &,修改的就是函数体中的临时变量 ———————————————— 原文链接:https://blog.csdn.net/Faracall/article/details/88621633 类型标识符 &引用名=目标变量名 # include <iostream> using namespace std ; int main ( ) { int num1 = 1 , num2 = 2 ; int & ref1 = num1 , & ref2 = num2 ; ///引用必须要初始化 cout << "num1 = " << num1 << ",num2 = " << num2 << endl ; cout << "ref1 = " << ref1 << ",ref2 = " << ref2 << endl ; ///修改引用的值将改变其所绑定的变量的值 ref1 = - 1 ; cout << "num1 = " << num1 << ",ref1 = " <<

C++指针初学习

人走茶凉 提交于 2020-01-17 06:33:24
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。 #include <iostream> using namespace std; int main () { int var1; char var2[10]; cout << "var1 变量的地址: "; cout << &var1 << endl; cout << "var2 变量的地址: "; cout << &var2 << endl; return 0; } 结果: var1 变量的地址: 0x28fefc var2 变量的地址: 0x28fef2 什么是指针? 指针 是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为: type *var-name; 在这里, type 是指针的基类型,它必须是一个有效的 C++ 数据类型, var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。 int *ip; /* 一个整型的指针 */ double *dp; /* 一个 double 型的指针 */ float *fp; /* 一个浮点型的指针 */ char *ch; /*

错题集

吃可爱长大的小学妹 提交于 2020-01-17 05:28:56
1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。 对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。 2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 错。数组名是地址,不是指针常量,它的值可以赋给指针。 3.有说明语句int a[4][5];,则a[2]+3表示 ( A) 。 A.a数组行下标为2、列下标为3的元素的地址 B.0a数组行下标为2、列下标为3的元素的值 C.a数组第2行的首地址 D.a数组第3行的首地址 a[2]表示地址。+3表示地址后移3个元素。 4.语句int *p; *p=50;执行时,不会有任何错误。 错。在执行时,*P没有值。printf不出来任何值。 5.对于以下结构定义,++p->str中的++加在 ( A) 。 struct { int len; char *str; } *p; A.指针str上 B.指针p上 C.str指的内容上 D.以上均不是 因为p->str是对指针str的引用。 6.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。 A.p->next=h B.p->next=NULL C.p->next->next=h D.p->.data=-1 p