指针变量

为什么要使用指针? [关闭]

随声附和 提交于 2020-03-01 22:20:05
我知道这是一个非常基本的问题,但是在使用高级语言编写了一些项目之后,我才开始进行一些基本的C ++编程。 基本上我有三个问题: 为什么在普通变量上使用指针? 我应该在何时何地使用指针? 如何将指针与数组一起使用? #1楼 在变量上使用指针的一种方法是消除所需的重复内存。 例如,如果您有一些大型的复杂对象,则可以使用指针为您所做的每个引用指向该变量。 使用变量,您需要为每个副本复制内存。 #2楼 在某些情况下,需要使用函数指针才能使用共享库(.DLL或.so)中的函数。 这包括跨语言执行操作,通常会提供DLL接口。 制作编译器 做科学的计算器,在哪里有函数指针的数组或向量或字符串映射? 尝试直接修改视频内存-制作自己的图形包 制作一个API! 数据结构-您正在制作的特殊树的节点链接指针 指针有很多原因。 如果您想保持跨语言兼容性,则在DLL中进行C名称处理尤其重要。 #3楼 这是我的助手,我不会答应成为专家,但是我发现指针在我要编写的其中一个库中很棒。 在这个库中(这是带有OpenGL的图形API :-),您可以创建一个三角形,并向其中传递顶点对象。 draw方法采用这些三角形对象,并根据我创建的顶点对象来绘制它们。 好吧,没关系。 但是,如果我更改顶点坐标怎么办? 用顶点类中的moveX()移动它还是其他东西? 好吧,好的,现在我必须更新三角形,添加更多的方法,并且浪费了性能

C++程序设计(面向对象进阶)崔毅东 ——第3单元第01节空指针和动态内存分配

蓝咒 提交于 2020-03-01 20:23:51
nullptr and Dynamic Memory Allocation (空指针和动态内存分配) 1. 空指针 1.1. 0带来的二义性问题 C++03中,空指针使用“0”来表示。0既是一个常量整数,也是一个常量空指针。 C语言中,空指针使用(void *)0来表示 有时候,用“NULL”来表示空指针(一种可能的实现方式是#define NULL 0) 1.2. C++标准化委员会希望“空指针”是一个确定的东 C++11中引入保留字“nullptr”作为空指针 2. Dynamic memory management: Allocate/Release (动态内存管理:分配/释放) 2.1. C++中通过运算符new申请动态内存 new <类型名> (初值) ; //申请一个变量的空间 new <类型名>[常量表达式] ; //申请数组 如果申请成功,返回指定类型内存的地址; 如果申请失败,抛出异常,或者返回空指针(nullptr)。(C++11) 2.2. 动态内存使用完毕后,要用delete运算符来释放。 delete <指针名>; //删除一个变量/对象 delete [] <指针名>; //删除数组空间 2.3.c和c++关于动态内存分配的区别 3.空指针和动态内存分配代码示例 # include <iostream> int main ( ) { int * p =

指针 * 跟类型还是变量名

佐手、 提交于 2020-03-01 17:52:39
星号跟谁? 算是指针系列的一个番外篇, 星号到底跟谁? #include <stdio.h> int main() { char * greet = "Hello World"; printf("%s", greet); return 0; } 单看 greet 是 char* 类型, 表示 N 个 char , 我就是全部; 但看 *greet 是 char 类型, 但有 N 个, 我是第一个. 不同表达, 不同含义. 下面一个简单的函数可以区别. #include <stdio.h> int main() { printf("%c", *greet); printf("%s", greet); return 0; } 略概看了些开源框架, 规范的写法还是跟名字 char *greets . 来源: https://www.cnblogs.com/swyw/p/12390936.html

C语言指针用法详解(二) 指针的算术运算

…衆ロ難τιáo~ 提交于 2020-03-01 12:24:00
例题1: Question : char a[20]; int *ptr = (int * )a; ptr++ Practice : Reason : #include <bits/stdc++.h> using namespace std; int main() { char a[20]; int *ptr = (int * )a;/// 强制类型转换不会改变a的类型 /*** ** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里 ** ptr 的类型是 int* , 指向的类型是 int , 指向整形变量 a ***/ cout<<" befor : " << ptr<<endl; ptr++; cout<< " sizeof (ptr) "<< sizeof(ptr)<<endl; /*** ** ptr 类型是指针,指针的自增,当然是增加自身的大小了 ** sizeof(ptr) 为4, ptr 增加4 ***/ cout<<" after : "<<ptr<<endl; } 例题2: Question : int arr[20] = {0}; int *ptr = arr; for (int i=0; i<20; i++) { (*ptr)++; ptr++; } Practice : Reason : #include <bits/stdc++.h> using

指针加减法运算的“定义域”

吃可爱长大的小学妹 提交于 2020-03-01 12:21:59
  指针变量加(减)一个整数。   例如:p++,p--,p+i,p-i,p+=i,p-=i等均是指针变量加(减)一个整数。   将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加(减)。     ————谭浩强 ,《C程序设计》(第四版),清华大学出版社,2010年6月,p290    在C语言中,任何运算都有前提条件。脱离了前提谈运算是荒谬的。   比如,一元“*”运算,其运算对象必须是非void *类型的指针。如果对一个int类型的数据或unsigned类型的数据做一元“*”运算,连编译都无法通过(这也间接说明了指针并非是一个32位无符号整数。参见§246)。   再比如,两个int类型数据相加,其前提条件是结果必须在int类型可以表示的范围之内,否则就成了一种未定义行为(undefined behavior)。   指针运算也是如此。并非所有的指针类型数据都有加(减)法运算。C语言并没有定义void *类型指针或指向函数的指针的加减法运算。换言之,指针的加减法运算只对那些指向数据对象(Object)类型的指针才可能有意义。比如:int *类型的指针可以做加减法运算。   指向数据对象类型的指针的加减法运算并没有限制运算对象是左值(lvalue)或可修改的左值(modifiable lvalue),用一句通俗的话来说

第二十九天

ⅰ亾dé卋堺 提交于 2020-03-01 09:23:21
字符数组和字符指针不是一回事 1字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址),决不是将字符串放到字符指针变量中。 2赋值方法不同,对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。 char str[20]; str=“miao”; 字符指针变量,可以采用下面方法赋值 char *; a=“miao”; 但注意赋给a的不是字符,而是字符串第一个元素的地址 3对字符指针变量赋初值 * char a=“miao”; = char *a; a=“miao”; 而对数组的初始化 char str[20]={“miao”}; 不能等价于 char str[20]; str[]=“miao”; 4如果定义了一个字符数组,在编译时为它分配内存单元,他有确定的地址,而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据 5指针变量的值是可以改变的,若定义一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符 用函数指针变量调用函数 可以用指针变量指向整形变量,字符串,数组,也可以指向一个函数,一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数的指针。

关键字(nonatomic/atomic)、(copy/retain/assign/strong/weak )、(readonly / readwrite)、(@property/@

落花浮王杯 提交于 2020-03-01 04:00:01
property关键字:设置成员变量的属性(有读/写,赋值assign,retain,copy ,以及对多线程的支持nonatomic) (1)nonatomic/atomic atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。 atomic :原子性访问,设置成员变量的@property属性时,默认为atomic,提供多线程安全。 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样: {lock} if (property != newValue) { [property release]; property = [newValue retain]; } {unlock} nonatomic :非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。 atomic是Objc使用的一种线程保护技术,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定 nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。基本上来讲

C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

拥有回忆 提交于 2020-03-01 03:05:02
在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般由程序员分配与释放,基程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 文字常量区:常量字符串是放在这里的,程序结束后由系统释放。 程序代码区:存放函数体的二进制代码。 C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h。它们的声明如下: void * malloc(int n); void free (void * p); void *calloc(int n,int size); void * realloc(void * p,int n); 1. malloc函数 malloc函数可以从堆上获得指定字节的内存空间

C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

孤者浪人 提交于 2020-03-01 03:04:40
在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般由程序员分配与释放,基程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 文字常量区:常量字符串是放在这里的,程序结束后由系统释放。 程序代码区:存放函数体的二进制代码。 C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h。它们的声明如下: 1 void * malloc ( int n); 2 void free ( void * p); 3 void * calloc ( int n, int size); 4 void * realloc ( void * p, int n); 1. malloc函数

Delphi指针类型

不羁的心 提交于 2020-02-29 22:17:14
首先新建一个控制台项目:练习下指针类型的数据赋值和使用 program Project1; {$APPTYPE CONSOLE} uses SysUtils; type pint=^Integer;//定义指针类型 var a:Integer; b:Integer; c:Integer; pt:pint;//整形指针 p:Pointer;//无类型指针 begin a:=2; b:=3; pt:=@b;//整形指针指向整形数据 Writeln('pt=', pt^); p:=@a;//无类型指针指向整形数据 //Writeln('p=', p^);错误,无类型指针不能直接使用 Writeln('p=', Integer(p^)); //c:=p^;错误,无类型指针不能直接赋值给其他变量 c:=Integer(p^); Writeln('c=', c); pt:=p;//指针间赋值,可以不用类型转换 Writeln('pt=', pt^); Readln; end. 来源: https://www.cnblogs.com/qqook/p/3466872.html