c语言指针

C++传值和传引用

烈酒焚心 提交于 2019-11-30 00:37:10
传值参数 首先你肯定明白一个道理:当初始化一个非引用类型的变量时,初始值被拷贝给变量,此时对变量的改动不会涌向初始值 int n = 0; int i = 1; // i是n的副本 i = 42; // i的值改变,n的值不改变 传值参数的机理完全一样,由于 每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化 ,所以 函数对形参做的所有操作不会影响实参 ,如果我们想让函数改变我们传入的实参本身们就可以用到 指针形参 访问函数外部对象 指针形参 先看一段代码: int n = 0; int i = 1; int *p1 = &n; //p1指向n int *p2 = &i; //p2指向i *p1 = 42; //n的值改变,p1不变 p1 = p2 //现在p1指向了i,但是i和n的值都不变 当执行指针拷贝操作时,拷贝的是指针的值(地址),拷贝之后,两个指针是不同的指针,因为指针可以使我们间接地访问所指向的对象,所以通过指针可以修改对象的值 指针形参也差不都 // 接受一个int类型的指针,然后将指针所指向的对象置0 void reset(int* ip) { *ip = 0; // 改变指针ip所指向对象的值 ip = 0; // 只改变了ip的局部拷贝,实参未被改变 } void reset(int i) { i = 0; } int main() { int

内核错误码处理宏

江枫思渺然 提交于 2019-11-29 21:41:20
Linux 有时候在操作成功时需要返回指针,而在失败时则返回错误码。但是 C 语言每个函数只允许一个直接的返回值,因此,任何有关可能错误的信息都必须编码到指针中。虽然一般而言,指针可以指向内存中的任意位置,而 Linux 支持的每个体系结构的虚拟地址空间中都有一个从虚拟地址 0 到至少 4K 的区域,该区域中没有任何有意义的信息。因此内核可以重用该地址范围来的编码错误码。 ERR_PTR 是一个辅助宏,用于将数值常数编码为指针。相关的宏如下: IS_ERR() 返回值是否是错误码 PTR_ERR(): 将返回值转化为错误码 ERR_PTR(): 根据错误码返回对错误的描述。 转载于:https://my.oschina.net/fuyajun1983cn/blog/263780 来源: https://blog.csdn.net/chijiandao3197/article/details/100930325

c/c++常见面试题(一)

佐手、 提交于 2019-11-29 21:39:57
0.static、const、volatile的作用和区别 static: https://www.cnblogs.com/Manual-Linux/p/8870038.html 第一 、在修饰变量的时候,static修饰的静态局部变量只执行一次,之后再初始化无效。而且延长了局部变量的生命周期,直到程序运行结束以后才释放。 第二 、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。 第三 、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0 const: 1.修饰的变量只读,不可改变 2.防止意外修改,减少bug 3.可以节省空间,避免不必要的 内存分配 volatile: 告诉编译器这个变量随时可变,不需要优化 1.请问全局变量和局部变量能否重名 能,局部会屏蔽全局。要用全局变量,需要使用"::" 2. 用三目运算符(X)>(Y)?(X):(Y)宏定义实现比较两个数的大小 #define MAX(X, Y) ((X)>(Y)?(X):(Y)) 3.malloc的了解 malloc是动态内存分配,是用户动态申请系统分配指定字节的内存块的函数。返回类型是 void* 类型 对应free,

C语言的零碎 (三)

China☆狼群 提交于 2019-11-29 19:15:43
main函数的标准原型应该是 int main(int argc, char *argv[]); 。 argc 是命令行参数的个数。而 argv 是一个指向指针的指针,为什么不是指针数组呢?因为前面讲过,函数原型中的 [] 表示指针而不表示数组,等价于 char **argv 。那为什么要写成 char *argv[] 而不写成 char **argv 呢?这样写给读代码的人提供了有用信息, argv 不是指向单个指针,而是指向一个指针数组的首元素 。数组中每个元素都是 char * 指针,指向一个命令行参数字符串。 指向非const变量的指针或者非const变量的地址可以传给指向const变量的指针,编译器可以做隐式类型转换,例如 char c = 'a'; const char *pc = &c; 但是,指向const变量的指针或者const变量的地址不可以传给指向非const变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告: const char c = 'a'; char *pc = &c; const int *a; int const *a; 这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。 int * const a;

函数总结

半城伤御伤魂 提交于 2019-11-29 18:51:48
函数总结 1.为什么要用函数 函数是C源码程序中最基本的功能单位,是一个可以从程序其它地方调用执行的语句块。   C语言是一种结构化程序设计语言,结构化程序设计思想是“分解”大问题,依次解决小问题,通过小问题解决实现大问题的解决,描述“小问题”解决方法的工具即是函数。   函数的定义格式如下:  type name ( argument1, argument2, ...) statement   说明:   type 是函数返回的数据的类型   name 是函数被调用时使用的名   argument 是函数调用需要传入的参量(可以声明任意多个参量)。每个参量(argument)由一个数据类型后面跟一个标识名称组成,就像变量声明中一样(例如,int x)。参量仅在函数范围内有效,可以和函数中的其它变量一样使用, 它们使得函数在被调用时可以传入参数,不同的参数用逗号(comma)隔开. ​ statement 是函数的内容。它可以是一句指令,也可以是一组指令组成的语句块。如果是一组指令,则语句块必须用花括号{}括起来,这也是我们最常见到情况。其实为了使程序的格式更加统一清晰,建议在仅有一条指令的时候也使用花括号,这是一个良好的编程习惯。 2.为什么要用函数重载 ​ 两个以上的函数具有相同的函数名,但是形参的个数或者类型不同

数组与指针、变量、字符数组、结构体及其他总结

╄→гoц情女王★ 提交于 2019-11-29 18:46:13
2019-07-18 一: 1. 软件模块划分:高内聚低耦合,提高模块独立性,即使用一个模块完成一项功能,耦合性越少越好。 2. 算法的性质:有穷性(有限操作步骤);确定性(含义唯一,步骤确定);有 0 个或多个输入;有一个或多个输出;有效性(步骤能有效执行)。 3. 同一文件中的所有函数都能引用全局变量的值。形式参数是局部变量。在函数外定义的变量是全局变量,在函数内定义的变量是局部变量。 二: 1. 程序的局部变量存在于 栈 中,全局变量存在于 静态区 中,动态申请数据存在于 堆 中。   内存中供用户使用的存储空间分为 3 部分:程序区;静态存储区;动态存储区。 静态存储区:全局变量(程序开始执行时给全局变量分配存储区,执行完毕后释放 ,占据固定的存储单元);静态局部变量(只在编译时赋一次初值,只能被本函数引用);静态外部变量(函数外部静态变量);外部变量。栈区。 动态存储区:函数形式参数(调用函数时给形参分配存储空间);自动变量,即函数中的没有用 static 声明的变量;函数调用时的现场保护和返回地址等。当函数调用开始时分配动态存储空间,函数结束时释放这些空间。栈区。 存储类别:自动( auto ,默认,动态存储区)、静态( static ,静态存储区)、寄存器( register , CPU 寄存器中)、外部( extern ,静态存储区)。 内存动态分配区域:随时开辟

c++面试题中经常被面试官面试的小问题总结(二)(本篇偏向指针知识)

Deadly 提交于 2019-11-29 18:45:55
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10713204.html 1.利用指针交换两个字符串方法?(这题是我当年读大一的时候看到的,好怀念!!!QAQ) (一)指针引用 #include<iostream> using namespace std; void swap(char *&a,char *&b) { char *temp; temp = a; a = b; b = temp; } int main() { char *ap = "hello"; char *bp = "word"; swap(ap,bp); cout<<"ap:"<<ap<<endl; cout<<"bp:"<<bp<<endl; return 0; } (二)二维指针指向一维 #include<iostream> using namespace std; void swap(char **a,char **b) { char *temp; temp = *a; *a = *b; *b = temp; } int main() { char *ap = "hello"; char *bp = "word"; swap(&ap,&bp); cout<<"ap:"<<ap<<endl; cout<<"bp:"<<bp<<endl; return

转载 :指针的强制类型转换

拟墨画扇 提交于 2019-11-29 18:45:45
c语言指针强制类型转换的应用 2017年10月28日 22:04:24 行走的帝企鹅 阅读数:2530 指针类型简介 c语言中,指针是就是内存地址,因此使用指针可以方便的操作内存数据。指针的类型标志着这个指针指向数据的类型,有两个作用: 告诉了编译器需要从这个地址开始对多少字节(n)的数据进行操作, 以及操作模式 告诉编译器当对这个指针进行增减操作时,每加(减)一对应实际地址内存移动的字节数(n) 你比如说 char* pointer1 //该指针指向从该地址开始一个1字节的内容 short int* pointer2; //该指针指向从该地址开始一个2字节的内容 long int* pointer3; //该指针指向从该地址开始一个4字节的内容 long long int* ponter4; //该指针指向从该地址开始一个8字节的内容 pointer1++ 使其对应内存地址移动一个字节 pointer2++ 使其对应内存地址移动两个字节 pointer3++ 使其对应内存地址移动三个字节 pointer4++ 使其对应内存地址移动四个字节 指针的强制类型转换 指针类型的强制类型转换就是重新告诉编译器: 需要从这个地址开始对多少字节(n)的数据进行操作, 以及操作模式 对这个指针进行增减操作时,每加(减)一对应实际地址内存移动的字节数(n) 你比如说 long int*

数组指针和指针数组的区别

戏子无情 提交于 2019-11-29 18:45:35
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

数组指针和指针数组的区别

我只是一个虾纸丫 提交于 2019-11-29 18:45:27
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a