c语言指针

C语言指针用法注意事项

痞子三分冷 提交于 2019-12-06 13:04:19
计算机系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参;2)字符常量区:主要是储存一些字符常量;3)全局区:在全局区里储存一些全局变量和静态变量;4)堆:堆主要是通过动态分配的储存空间,即以下讲的讲的动态分配内存空间。 定义int型指针int *p,p是用来储存一个地址的值的,我们之所以要为p分配空间是让它有一个明确的指向,比如你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,这个路标是瞎指的,这样我们就不能够通过它来明确到底哪里是东,哪里是西了。也就是说在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切int类型变量的地址,所以必须要让它有一个明确的指示方向。所以就要通过动态分配内存的方式来认为的规定确定其方向。 当malloc()函数为一个指针变量p分配了地址,当对p结束操作的时候要释放p的内存空间。动态分配的变量时储存在堆里面,但是这个堆的空间不是无限大的,也许当编一个小的程序的时候可能不会产生影响,但是对于那些大的程序,如果不及时释放堆的空间就会发生内存泄露。所谓内存泄露是因为堆的空间被我们动态分配用完了,这样再去使用动态分配堆的空间的时候就没有足够的空间可以使用了,这样就需要占有原来的空间,也就是会把其他的空间来储存我们键入的值,这样会导致原来储存的数据被冲掉,导致了内存泄露。 而且当使用malloc(

GameHollywood 面试笔记

依然范特西╮ 提交于 2019-12-06 12:25:14
GameHollywood 面试笔记 Intro 面试的职位是 C++开发工程师,主要聊的还是C++。在过程中自我感觉面得还行,至少没 上次 那么蠢。 聊的内容主要集中在STL和线程安全、资源管理的层面。 惯例的,填完面试信息表并简历一起上交,然后等面试官来客套完,就开始聊技术了。 注意,面试官的提问并非原话,有修饰和脑补。 0. 预热:你用哪个版本的C++? 客套话什么的就略了。 面试官:...行,那我们就聊聊C++吧。你常用哪个版本的C++? 我:我比较常用的是C++11。 C++版本这个问题面试里应该不多见,不过作为引入的话题还行,标准之神会瞑目的。 对于 C++版本 这个词,很大概率上大家说的应该就是C++标准委员会 WG21 制定的C++标准了,最新版本的标准文档是C++17定稿 N4659 ,制定中的C++20标准文档可以访问 WG21/docs/papers/2018 查阅。 需要注意的是,如果答成了 我用VC6 之类的骚话,很大概率会留下不好的映像——或者对方也是忠实的VC6神教教徒的话,达成共识也说不定。 闲话少叙。 1. 起手式: std::shared_ptr 面试官:说说 std::shared_ptr 是怎么实现的?一般怎么去使用它? 答: shared_ptr 是通过 引用计数 实现的,它可以作为容器元素,在程序里传递blabal.....而且

JNI 实战全面解析

倖福魔咒の 提交于 2019-12-06 08:22:51
简介 项目决定移植一款C++开源项目到 Android 平台,开始对JNI深入研究。 JNI是什么? JNI( Java Native Interface)意为 Java 本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。 NDK是什么? Android NDK(Native Development Kit )是一套工具集合,允许你用像C/C++语言那样实现应用程序的一部分。 为什么要用NDK? 1、安全性,java是半解释型语言,很容易被反汇编后拿到源代码文件,我们可以在重要的交互功能使用 C语言 代替。 2、效率,C语言比起java来说效率要高出很多。 JNI和NDK的区别? 从工具上说,NDK其实多了一个把.so和.apk打包的工具,而JNI开发并没有打包,只是把.so文件放到文件系统的特定位置。 从编译库说 , NDK开发C/C++只能能使用NDK自带的有限的头文件,而使用JNI则可以使用文件系统中带的头文件。 从编写方式说, 它们 一样。 详解 1、JNI 元素 1、JNI组织结构 JNI函数表的组成就像C++的虚函数表,虚拟机可以运行多张函数表。 JNI接口指针仅在当前线程中起作用,指针不能从一个线程进入另一个线程,但可以在不同的线程中调用本地方法。 2、原始数据 Jobject 对象 引用类型 Java类型

【C语言】 指针

浪子不回头ぞ 提交于 2019-12-06 08:22:37
学习 C 语言的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的。 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址: #include <stdio.h> int main () { int var1; char var2[10]; printf("var1 变量的地址: %p\n", &var1 ); printf("var2 变量的地址: %p\n", &var2 ); return 0; } 当上面的代码被编译和执行时,它会产生下列结果: var1 变量的地址: 0x7fff5cc109d4 var2 变量的地址: 0x7fff5cc109de 什么是指针? 指针 是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为: 类型名 *变量名比如:int *ip; /* 一个整型的指针 */double *dp; /* 一个 double 型的指针 */float *fp; /* 一个浮点型的指针 */ char *ch; /*

C博客作业05--指针

左心房为你撑大大i 提交于 2019-12-06 06:41:15
0.展示PTA总分 1.本章学习总结 1.1学习内容总结 指针变量的定义 类型名: *指针变量名 例如: int *p;//定义一个整型变量p,指向整型变量; 指针和数组的赋值与初始化 一般情况下,数组的地址不能修改,内容可以修改;而指针的内容可以修改,指针指向的内容也可以修改,但这之前要为指针初始化。 如: int p[5]; p=p+1; //错误 而p[0]=1; //正确 // int *p; p=p+1; //正确 p[0]=1;//错误,指针没有初始化; // int i; int *p=&i; p[0]=1;//正确 对于字符指针还有比较特殊的情况。 如: char * p="abc"; p[0]='d';//错误 指针做循环变量做法 例如:对数组元素求和 int a[100]; int *p; int sum=0; p=a; for(p=a;p<=&a[99];p++) { sum+=*p; } 在循环中,指针变量p的初值是数组a的基地址,P连续取值&a[0],&a[1],…&a[99]。 字符串指针如何表示字符串 对指向字符变量的指针变量应赋予该字符变量的地址。 例如: char c, *p=&c;//表示p是一个指向字符变量c的指针变量。 char *s="apple";//表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。 用字符串指针指向一个字符串。

C博客作业05--指针

回眸只為那壹抹淺笑 提交于 2019-12-06 06:41:05
0.展示PTA总分 1.本章学习总结 1.1学习内容总结 1.指针做循环变量做法 基本做法如下: int a[10]; int *p; p=a;//指针指向a数组的首地址 fgets(a,10,stdin); for(p=a;*p!='0'&&*p!='\n',p++) { 循环结构; } 2.字符指针如何表示字符串 基本做法如下: char str[]="abc"; char *p; for(p=str;*p!='0'&&*p!='\n',p++) { 循环结构; } 3.动态内存分配 1.动态内存分配的步骤 (1)了解需要多少内存空间。 (2)利用C语言提供的动态分配函数来分配所需要的储存空间。 (3)使指针指向获得的内存空间,以便用指针在该空间内实施运算或操作。 (4)当使用完毕内存后,释放这一空间。 2.动态存储分配函数 1.malloc() 函数原型是 : void * malloc(unsigned size) 2.calloc() 函数原型是 : void * calloc(unsigned n,unsigned size) 两者的区别仅在于calloc函数在分配后还把存储块里全部初始化为0,而malloc函数不会。 3.动态存储释放函数free() 函数原型为 : void free (void * ptr) 这个函数十分关键却又经常被人遗忘

C语言博客作业05——指针

蹲街弑〆低调 提交于 2019-12-06 06:38:12
0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.2 本章学习体会 2.PTA实验作业 2.PTA实验作业 2.1 2.1.1 伪代码 2.1.2 代码截图 2.1.3 总结本题的知识点 2.1.4 PTA提交列表及说明 2.2 2.2.1 伪代码 2.2.2 代码截图 2.2.3 总结本题的知识点 2.2.4 PTA提交列表及说明 2.3 2.3.1 伪代码 2.3.2 代码截图 2.3.3 总结本题的知识点 2.3.4 PTA提交列表及说明 3.阅读代码 来源: https://www.cnblogs.com/xingyufen/p/11965855.html

C博客作业05--2019-指针

折月煮酒 提交于 2019-12-06 06:36:13
0.展示PTA总分 展示关于“指针题目集”分数截图。 1.本章学习总结 1.1 学习内容总结: 指针做循环变量做法 字符指针如何表示字符串 动态内存分配 指针数组及其应用 二级指针、行指针 函数返回值为指针 1.2 本章学习体会 1.通过学习了指针,在函数使用时,可以只传地址,而不用像以前一样,传这个组,这样可以节省内存,又提高了传输效率。指针还可实现动态内存分配,避免造成内存浪费。通过函数改变一个变量的值,就得用指针传递。如果用普通变量传递,则无法实现。 2.初学指针,对指针的使用还是不熟练。p是一个内存地址值, p是地址p指向的内容。对p和 p的使用还比较模糊。p++即可实现指针#指向数组的下一个元素,指针的使用还是比较方便的。 3.C语言的学习感觉在难度上是一直在递增的,这次学习的指针和地址的概念比较抽象,理解上也比较困难,感觉并不是很能够完全领会,再加上近期的线性代数考试等一些考试的准备,对C语言的学习也有所放松,预习复习不够及时,大量知识点需要在经过自己再重新阅读,PTA写得不是很及时. 2.PTA实验作业 来源: https://www.cnblogs.com/lowena/p/11965359.html

C语言博客作业05--指针

梦想的初衷 提交于 2019-12-06 06:36:13
0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.如果事先无法确定需要处理的数据数量,有两种处理方法:一种方法是估计一个上限,并将该上限作为数组长度,但是这样常常会造成空间浪费;另一种方法是利用指针来实现存储空间的动态分配 2.使用指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数调用中使用指针可以返回多个值 3.一般数据是按照“地址”存取的 4.程序执行时将变量翻译为它所在的内存地址来进行操作,这种使用变量的方法叫做“直接访问”,直接访问一般以内存单元的第1个字节的地址作为它的地址 5.在C程序中还有一种使用变量的方法,即通过变量的地址进行操作,用指针访问内存和操纵地址,比如再定义一个变量来专门存放另一个变量的地址,这种方法称为“间接访问” 6.在C语言中把专门用来存放变量地址的变量称为“指针变量”,简称为指针 7.指针是用来存放内存地址的变量,如果一个指针变量的值是另一个变量的地址,就称该指针变量指向那个变量 8.&n表示变量n的内存地址或存储位置,&被称作地址运算符,&是一元运算符,与其他的一元运算符有同样的优先级和从右到左的结合性 9.定义指针的一般形式为: 类型名 * 指针变量名 ps:* 指的是指针声明符 10.在许多场合,可以把指针变量简称为指针,但实际上指针和指针变量在含义又上存在一定的差异,一般来说,在C语言中,指针被认为是一个概念

C语言第八讲,指针*

ぃ、小莉子 提交于 2019-12-06 06:35:56
C语言第八讲,指针*             C语言第八讲,指针* 一丶简单理解指针 说到指针,很多人都说是C语言的重点. 也说是C语言的难点. 其实指针并不是难.而是很多人搞不清地址 和 值.以及指针类型. 为什么这样说. 假设有两个变量,如下 int nNum1 = 1; int nNum2 = 0x00401000; 变量nNum1 保存的值是1 变量nNum2 保存的是一个16进制数值. 那么如果我们把保存16进制的这个变量.当作指针. 也就是说它保存了一个16进制数值而已. 我们可以通过16进制找到里面存储的值. 但是因为是保存地址的变量.所以我们需要加上特殊符号进行定义. 例如:    int *nNum2 = 0x004010000; 指针其实就是保存了一个特殊的数值而已. 而通常这个数值我们说是地址. 如果我们保存了1的地址,那么我们就可以访问1了. 怎么访问? 可以通过取内容符号进行访问. int nNum = 1; int *p = &nNum1; //保存1的地址,我们可以不用管.也可以理解为一个16进制数值而已. *p = 3; //修改地址空间的值. 二丶指针的数据类型 说到指针.其实我们说的并不是保存地址的难点.难点是该如何解释这个地址. 例如我们知道定义一个变量.我们可以知道这个变量的内存空间跟随这数据类型走. 例如:    int nNum1 = 3