指针

28-指针的定义和初始化

拜拜、爱过 提交于 2020-01-04 05:47:36
本节知识点: 1、指针变量 2、定义一个指针变量 3、指针变量的引用 4、指针变量的初始化方法 5、使用*获取指针对应存储区域的内容 ---------------------------------------------------------------------------------------------------- 1、指针变量    在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。   因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。 注意,严格意义上讲:    指针 是一个地址, 是一个常量。    指针变量 是存放一个地址, 是一个变量。 指针变量用于存放指针(地址)。 对比整型数据理解:int a = 10;   10 是一个整型数据, 是一个常量   整型变量a是存放整型数据的,是一个变量。 图中:变量i_pointer 就是一个指针变量,查看k = i + j; 的存储过程 2、定义一个指针变量 对指针变量的定义包括3个内容:   (1) 指针类型说明,即定义变量为一个指针变量   (2) 指针变量名   (3) 变量值(指针) 一般形式为: 类型说明符 *变量名 可以理解为 (类型说明符 *)变量名   其中, 这里的*只具有象征意义,仅表示这是一个指针变量 ,变量名即为定义的指针变量的名称

【知识总结】指针

你说的曾经没有我的故事 提交于 2020-01-04 05:47:22
1.内存和地址 (1)内存中的每个位置由一个独一无二的地址标识; (2)内存中的每个位置都包含一个值; (3)变量名字与内存地址相对应,由编译器为我们实现,变量给了我们更方便的方法记住地址(硬件仍然通过地址访问内存位置); 【注】在某些要求边界对齐(boundary alignment)的机器上,整型值存储的起始位置只能是某些特定的字节,通常是2或者4的倍数; 2.值和类型 不能简单地通过检查一个值的位来判断它的类型,判断一个值的类型(以及它的值),必须观察程序中这个值的使用方法; 3.指针变量的内容 (1)一个变量的值就是分配给这个变量的内存位置多存储的数值; (2)指针变量存储的是某块内存的地址; 4.间接访问操作符 通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing point)。这个用于执行间接访问的 操作符是单目操作符*。 5.未初始化和非法的指针 声明一个指针并不会自动分配任何内存,在对指针执行间接访问前,指针必须进行初始化。 6.NULL指针 【注】对一个NULL指针进行解引用是非法的,在对指针解引用之前你首先必须确保它并非NULL指针。 7.指针常量 【问】如果想把25这个值存在100这个位置,该怎么办? 【答】 *(int *)100 = 25; 来源: https://www.cnblogs.com

C++指针小记

老子叫甜甜 提交于 2020-01-04 05:46:21
1、指针变量的声明: 数据类型 *指针变量名; int *p; //声明一个用于存储int型变量地址的指针变量p,即变量p是一个指向int类型的指针变量 2、指针变量的初始化 数据类型标识符 *指针变量名=初始地址值; int i; //定义一个整型变量i,并为i分配内存空间 int *p=&i; //定义p为指针变量,并将i的地址赋值给指针变量p作为初值 特例:指向字符类型的指针变量可以对字符串进行初始化 char *str="Hello World"; //将字符串的第0个字符'H'的地址赋给指针变量str 3、一个程序: 1 void main() 2 { 3 char *p="hello world"; 4 cout<<*p<<endl; 5 cout<<&p<<endl; 6 cout<<p<<endl; 7 } 结果: 4、*和&运算符 *为指针运算符,用以返回指针变量所指向 变量的值。 &为取地址运算符,用以返回变量的指针,即 变量的地址。 例子: int *p; //声明p是一个int型的指针 y=*p; //将指针p所指向的值赋给y,即y是一个值,而不是指针 例子: int n=1; int &q=n; //声明一个int型的引用名q,该引用名是变量n的别名 例子: int p=&x; //对指针变量p赋初值 5、数组指针:指向数组元素的指针称为数组指针。 6

c++ 指针(一)

ぃ、小莉子 提交于 2020-01-04 05:45:39
指针 每一个变量都有一个内存位置 ,每一个内存位置都定义了可使用连字号( & )运算符访问的地址,它 表示了在内存中的一个地址 #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 变量的地址: 0xbfebd5c0 var2 变量的地址: 0xbfebd5b6 一、定义 指针是一个变量,其值为另一个变量的地址 ,即, 内存位置的直接地址 。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。 type *var-name; 星号是用来指定一个变量是指针 int *ip; /* 一个整型的指针 */ double *dp; /* 一个 double 型的指针 */ float *fp; /* 一个浮点型的指针 */ char *ch; /* 一个字符型的指针 */ 所有 指针的值的实际数据类型 ,不管是整型、浮点型、字符型,还是其他的数据类型, 都是一样的,都是一个代表内存地址的长的十六进制数 。

C++指针初学习

巧了我就是萌 提交于 2020-01-04 05:45:21
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。 #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; /*

C++中的显示类型转换

ε祈祈猫儿з 提交于 2020-01-04 05:40:24
C++中显示转换也成为强制类型转换(cast),有四种:static_cast、dynamic_cast、const_cast、reinterpret_cast。命名的强制类型转换符号一般形式如下: cast_name<type>(expression); 以下分别介绍 一、static_cast 任何具有明确定义的类型转换,只要不包含底层const都可以使用static_cast。好吧这句话我不是很懂,换句话:编译器隐式执行的任何类型转换都可以由static_cast显示完成。也就是说,两类型之间可以发生隐式的转换,就可以用static_cast显示转换,有点意思。但要知道的是C++基本类型的指针之间不含有隐式转换(void*除外、const的有些也是可以的),需要 显示转换 。什么意思?如下: double d=3.14; int i=d; //编译器的隐式转换,等价于下面这条语句 int i=static_cast<int>(d); /*指针之间的转换*/ char str[]="good"; char *ptr=str; int *p=static_cast<int *>(ptr); //编译错误,两者之间的转换要显式,如下 int *p=(int *)(ptr); 仅当类型之间可隐式转换时(除类层次见的下行转换以外),static_cast的转换才是合法的,否则将出错。

地址、指针与引用

岁酱吖の 提交于 2020-01-04 05:39:17
  计算机本身是不认识程序中给的变量名,不管我们以何种方式给变量命名,最终都会转化为相应的地址,编译器会生成一些符号常量并且与对应的地址相关联,以达到访问变量的目的。   变量是在内存中用来存储数据以供程序使用,变量主要有两个部分构成:变量名、变量类型,其中变量名对应了一块具体的内存地址,而变量类型则表明该如何翻译内存中存储的二级制数。我们知道不同的类型翻译为二进制的值不同,比如整型是直接通过数学转化、浮点数是采用IEEE的方法、字符则根据ASCII码转化,同样变量类型决定了变量所占的内存大小,以及如何在二进制和变量所表达的真正意义之间转化。而指针变量也是一个变量,在内存中也占空间,不过比较特殊的是它存储的是其他变量的地址。在32位的机器中,每个进程能访问4GB的内存地址空间,所以程序中的地址采用32位二进制数表示,也就是一个整型变量的长度,地址值一般没有负数所以准确的说指针变量的类型应该是unsigned int 即每个指针变量占4个字节。还记得在定义结构体中可以使用该结构体的指针作为成员,但是不能使用该结构的实例作为成员吗?这是因为编译器需要根据各个成员变量的大小分配相关的内存,用该结构体的实例作为成员时,该结构体根本没有定义完整,编译器是不会知道该如何分配内存的,而任何类型的指针都只占4个字节,编译器自然知道如何分配内存。我们在书写指针变量时给定的类型是它所指向的变量的类型

C语言中的强制类型转换

情到浓时终转凉″ 提交于 2020-01-04 05:38:37
C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。 例如,定义如下: int a; float b; double c; long double d; ( 假设它们所占的字节分别是 4 、 8 、 8 、 10 ,而且连续存储于某个地址空间,起始地址是 100 ,则我们可以得到如下内存分布 ) a变量就是由以地址100开始到103结束的4个字节内存空间内的0-1代码组成。b变量则是由以地址104开始到112结束的8个字节内存空间内的0-1代码组成。而在机器中,这些内存都是连续的0-1代码,机器并不知道100~103是整型而104~111是float型,所有这些类型都是编译器告知的。当我们用a时,由于前面把a定义为int型,则编译器知道从a的地址开始向后取4个字节再把它解释成int型。那么(float)a,就是先按照int类型取出该数值,再将该数值按照int to float的规则转换成float型。所以强制类型转换就是按照某个变量的类型取出该变量的值,再按照***to***的规则进行强制转转换。如果是(类型名

C语言指针类型 强制转换

99封情书 提交于 2020-01-04 05:38:08
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。 例如,定义如下: int a; float b; double c; long double d; (假设它们所占的字节分别是 4、 8、 8、 10,而且连续存储于某个地址空间,起始地址是 100,则我们可以得到如下内存分布 ) a变量就是由以地址100开始到103结束的4个字节内存空间内的0-1代码组成。b变量则是由以地址104开始到112结束的8个字节内存空间内的0-1代码组成。而在机器中,这些内存都是连续的0-1代码,机器并不知道100~103是整型而104~111是float型,所有这些类型都是编译器告知的。当我们用a时,由于前面把a定义为int型,则编译器知道从a的地址开始向后取4个字节再把它解释成int型。那么(float)a,就是先按照int类型取出该数值,再将该数值按照int to float的规则转换成float型。所以强制类型转换就是按照某个变量的类型取出该变量的值,再按照***to**

C++ 循环队列

故事扮演 提交于 2020-01-03 20:05:20
在非空队列里,队首指针始终指向队头元素,而队尾指针始终指向队尾元素的下一位置。 顺序队列中存在“假溢出”现象。因为在入队和出队操作中,头、尾指针只增加不减小,致使被删除元素的空间永远无法重新利用。因此,尽管队列中实际元素个数可能远远小于数组大小,但可能由于尾指针巳超出向量空间的上界而不能做入队操作。该现象称为假溢出。如下图所示是数组大小为5的顺序队列中队首、队尾指针和队列中元素的变化情况 为了解决假溢出问题,采用循环队列,看下图 入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,无法通过front=rear来判断队列“空”还是“满”。解决此问题的方法是:约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满。 即rear所指的单元始终为空。 判断是否队满(入队操作尾指针) (q.rear+1)%MAX == q.front q.rear = (q.rear+1)%MAX 判断是否队空(出队操作头指针) q.front==q.rear q.front = (q.front+1)%MAX # include <iostream> using namespace std ; # define MAX 5 //循环队列 struct Queue { int data [ MAX ] ; int front ; //队首指针 int