指针变量

指针重温(一)

心已入冬 提交于 2020-03-19 13:30:47
🔺定义 内存地址的变量。 int a = 3; int *pa; pa = &a; //&为取址运算符,表示取变量a的地址 printf("a = %d\n", a); printf("*pa = %d\n", *pa); printf("pa = %p\n", &a); printf("pa = %p\n", pa); 输出结果: 学习第一步:分清不同变量名最后输出的是什么内容,是地址还是常数。 总结: a是存放值的变量名,pa是指向变量a的指针变量名,也就是说pa里头存放的是a的地址,所以pa == &a。 *是间接运算符,也可叫做取值运算符,也可叫解引用运算符,所以*pa是取pa存放的地址里存放的值 就是3。 🔺声明指针 声明指针变量时必须指定指针所指向变量的类型。 声明时,*和指针之间的空格可有可无,通常,程序员在声明时使用空格,在解引用时省略空格。 ·编写程序时,可以认为变量有两个属性:名称和值(还有其他性质,例如类型,但是暂且不论)。 ·计算机编译和加载程序时,变量也有两个属性:地址和值。地址就是变量在计算机内部的名称。 🔺指针和数组 **指针和一维数组 一维数组名是数组首元素地址 int array[4] = {0, 1, 2, 3}; int *parray; int i; parray = array; for (i=0; i<4; i++) printf(

智能指针实例

佐手、 提交于 2020-03-19 12:58:25
摘要: 智能指针:通过C++模板技术实现的一个类模拟指针的行为(如->、*) 1. 内存泄漏(臭名昭著的Bug) (1)动态申请堆空间,用完后不归还(堆空间越来越少,的那个程序长时间运行,就会导致总堆空间内存没有了) (2)C++语言中没有垃圾回收的机制 (3)指针无法控制所指堆空间的生命周期(指针是变量,有生命周期,即一个局部指针指向了堆空间之后,当该指针的生命周期结束后,这段堆空间的生命周期并没有结束,这就发生了泄漏) 2. 当代C++软件平台中的智能指针 (1)指针生命周期结束时主动释放堆空间 (2)一片堆空间最多只能由一个指针标识(一片堆空间最多只能由一个指针 可以避免多次释放对空间的问题,因为如果有两个指针同时指向同一块内存空间,内存空间有可能会被释放两次造成内存错误) (3)杜绝指针运算和指针比较 3.智能指针的设计方案 (1)通过类模板描述指针的行为,能够定义不同类型的指针对象 (2)重载指针特征操作符(->和 *),利用对象模拟原生指针的行为 (3)智能指针的使用军规:只能用来指向堆空间中的单个对象(即不能指定一个数组对象的空间)或者变量 【编程实验】智能指针 Smartpointer.h #ifndef SMARTPOINTER_H #define SMARTPOINTER_H namespace DTLib { template < typename T >

C语言总结2

廉价感情. 提交于 2020-03-19 08:42:36
12).预处理指令 1. 什么叫做预处理代码. 以#开头的代码就是预处理代码 #warning #import 2. 手写1个C程序的步骤.(面试题) 1>编写代码 2>编译 1)执行.c中的预处理代码 2)检查语法 3>链接 4>执行 3. 预处理指令的分类.(面试题) ****** 1>文件包含指令 #include 2>宏定义 #define (用来替换代码) 3>条件编译 #if (满足一定的条件才编译) 4. 预处理指令的特点. 1>都是以#开头 2>后面没有分号 3>在编译的时候,检查语法之前进行 "注意 以#开头的代码就是预处理代码 13).sizeof运算符 sizeof运算符的作用? 作用:计算常量,变量在当前系统上内存中所占的字节数 sizeof (数据类型) sizeof (变量)-----用的最多! sizeof (常量) 注意, char类型的变量在内存中占1个字节; char类型的常量在内存中占4个字节; 综上所述,为了安全起见,sizeof后面最好加上括号! 14).按位异或 ^ 异或运算 不同为1,相同为0 注意: 1 相同整数相^的结果是0; 2 一个整数^另一个整数2次结果不变 ; 3^2^2 = 3 3 整数相^跟顺序无关 3^2^3 = 2^3^3 = 2 15). 按位左移或者右移 1,按位左移运算. << 参与按位左移运算的二进制数据.

指针系统学习2

故事扮演 提交于 2020-03-19 08:42:14
1.数组与指针   一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。   指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。   所谓数组元素的指针就是数组元素的地址。 2.指向数组元素的指针   定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。   例如:   int a[10];(定义a为包含10个整型数据的数组)   int *p; (定义p为指向整型变量的指针变量)。   应当注意,如果数组为int型,则指针变量的基类型亦应为int型。 3.下面是对该指针变量赋值:   p = &a[0];把a[0]元素的地址赋给指针变量p。 也就是使p指向a数组的第0号元素,见图 -->> 4.通过指针引用数组元素:   引用一个数组元素,可以用:   (1) 下标法,如 a[i] 形式;   (2) 指针法,如*(a+i)或*(p+i)。   其中的a是数组名,p是指向数组元素的指针变量,其初值 p=a。   注意:数组名即“翻译成数组的第一个元素的地址! 例题: 输出数组中的全部元素 假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法: (1) 下标法 #include <stdio.h> void main() { int a[10]; int i; for(

dll的创建和使用

风流意气都作罢 提交于 2020-03-18 19:50:32
前几天有个朋友问道这个问题,结果因为以前从没搞过这个,对vs2005也不熟悉,竟花了2个小时才搞定, 。 特地拿来与大家分享,希望能给像我这样的菜鸟们一些帮助,O(∩_∩)O 【第一步】创建自己的dll 1.打开vs2005,选择菜单【File-New-Project】,在弹出对话框中选择[Visual C++]下的[Win32]-[Win32 Console Application],输入工程名后确认。 2.在弹出的对话框中选择[next],在Application Settiongs中选择Application type为Dll,Additional options选择Empty project,然后点Finish。 这时就创建了一个空的可以生成dll文件的工程。 3.在工程中添加一个头文件(这里为dll_test.h),在头文件中写入如下内容: 1 #ifndef _DLL_TUTORIAL_H 2 #define _DLL-TUTORIAL_H 3 4 #include<iostream> 5 6 #if defined DLL_EXPORT 7 #define DECLDIR _declspec(dllexport) 8 #else 9 #define DECLDIR _declspec(dllimport) 10 #endif 11 12 extern "C" 13 {

1161 字符串长度(指针专题)

爱⌒轻易说出口 提交于 2020-03-18 15:15:25
题目来源: https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1161 Description 编写一函数len,求一个字符串的长度,注意该长度不计空格。要求用字符指针实现。在主函数中输入字符串,调用该len函数后输出其长度。 int len(char *sp) { //实现sp所指串的长度,不计空格。 } Input 输入一个字符串,以回车结束,长度不超过100。 Output 输出一个整数,单独占一行。 Sample Input What day is today? Sample Output 15 题意描述: 输入一个字符串(长度不超过100) 调用len函数计算该字符串的长度,不计空格 解题思路: 在len函数中判断是否空格,不是计数变量加一,最后返回即可 程序代码: 1 #include<stdio.h> 2 #include<string.h> 3 int len(char *str); 4 int main() 5 { 6 char str[110]; 7 gets(str); 8 printf("%d\n",len(str)); 9 } 10 int len(char *str) 11 { 12 int i,l,count=0;//注意计数变量的初始化 13 l=strlen(str); 14 for(i=0;i<l

2019 第六周作业

不想你离开。 提交于 2020-03-18 14:41:17
2019春季第六周作业 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 ( https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888 ) 我在这个课程的目标是 理解变量、内存单元和地址之间的关系,掌握指针变量的基本运算 这个作业在哪个具体方面帮助我实现目标 这个作业让我大概了解了指针的定义及用法 参考文献 ( https://jingyan.baidu.com/article/20095761754006cb0721b4bb.html ) 一、基础题 1、求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double *a, double *b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b

C++的多态与切片问题(Section Problem)

对着背影说爱祢 提交于 2020-03-17 16:43:21
C++内存分配的方式大体上可以归纳为3种 1) 从静态存储区中分配:内存在编译时就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,static变量 2) 在栈上分配:执行函数时,函数内局部变量的存储单元都可在栈上创建,函数执行结束时,这些存储单元自动被释放 3) 在堆上分配:也称为动态内存分配,程序在运行的时候用malloc或new申请任意多少的内存,除非程序运行结束或者程序员自己用free或delete释放动态内存,否则这块动态内存一直存在 多态性是指为一个函数名关联多种含义的能力,即同一种调用方式可以映像到不同的函数。这种把函数的调用与适当的函数体对应的活动又称为绑定(binding)。根据绑定所进行阶段的不同,可分为早期绑定(early binding)、晚期绑定(late binding),早期绑定发生在程序的编译阶段,称为静态联编(static binding),晚期绑定发生在程序的运行阶段,称为动态联编(dynamic binding)。 1) 早期绑定(Early Binding):也称为编译期多态,指绑定是发生在编译阶段。 1 //: Poly.cpp 2 #include <iostream> 3 4 using namespace std; 5 6 class A { 7 public: 8 A() : x(5) {} 9 virtual void

指针和动态数组 new ,delete

纵然是瞬间 提交于 2020-03-17 06:58:15
............心中要有一内存块,以便理解知识 计算机储存数据必须知道数据的3种属性: 1.存储在何处.......并起名 2.值 3.类型 (1)int a;a=30; (2)int *b=&a; (3).int *a,b;注意...整型....指针a,整型...变量b,对每个指针都要有一个*; .......................指针.......................................... 1.指针是一个变量,存储的是...值的地址,而不是值本身, 指针变量 是指向特定变量类型指针,和数组相似 ..int* tax;...............指向int变量的指针,又叫整型指针 ..double * str;.............指向double变量的指针 ..int 指针和double指针虽然指向的数据类型不同, 但这两个变量本身长度的通常是一样的,好比1016可能是超市的地址,也可能是,村庄的地址一样,.....地址的长度或值,不能指示该地址上有什么建筑物,也不指示有关变量的长度或类型的任何信息 .显示地址,cout常用16进制 .......................指针与c++原理.......................................... oop强调的是运行阶段进行决策; 如

C++中“强制转换”的四大天王

只谈情不闲聊 提交于 2020-03-17 06:32:28
RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。 RTTI机制的产生 为什么会出现RTTI这一机制,这和C++语言本身有关系。和很多其他语言一样,C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求,C++中的指针或引用(Reference)本身的类型,可能与它实际代表(指向或引用)的类型并不一致。有时我们需要将一个多态指针转换为其实际指向对象的类型,就需要知道运行时的类型信息,这就产生了运行时类型识别的要求。和Java相比,C++要想获得运行时类型信息,只能通过RTTI机制,并且C++最终生成的代码是直接与机器相关的。 我对Java的运行时类型识别不是很熟悉,所以查了一下相关资料:Java中任何一个类都可以通过反射机制来获取类的基本信息(接口、父类、方法、属性、Annotation等),而且Java中还提供了一个关键字,可以在运行时判断一个类是不是另一个类的子类或者是该类的对象,Java可以生成字节码文件,再由JVM(Java虚拟机)加载运行,字节码文件中可以含有类的信息。 typeid和dynamic_cast操作符 RTTI提供了两个非常有用的操作符