c语言指针

C语言-指针词库

匿名 (未验证) 提交于 2019-12-03 00:37:01
type *ptr; //type类型的指针,名为ptr *ptr; //ptr所指向位置的值。 *(ptr + i); //(ptr所指向位置加上i)的值。 &thing; //thing的地址。 type *ptr = &thing; //名为ptr,type类型的指针,值设置为thing的地址。 ptr++; //自增ptr指向的位置。 文章来源: C语言-指针词库

关于指针类型和指针类型转换的理解

匿名 (未验证) 提交于 2019-12-03 00:37:01
“ 值相同的两个指针所指向的变量的值可以不同 ” 这句话时,发现自己对指针类型一些概念仅仅是记住了结论。于是以理解这句话为出发点,查阅了一些资料,用这篇博客来记录一下一些与指针类型和指针类型转化相关的知识。 一些用到的 在开始之前,先来复习一些下面会用到的知识。 1.内存地址,字节,位   位(bit)是电子计算机中最小的数据单位。每一位的状态只能是0或1。   字节(Byte)是用于计量存储容量的一种单位,每一个字节由8位组成(1Byte = 8bit)。   内存地址是在一片内存中,每个一个字节的编号。   他们在内存中的关系就好像,内存是一栋大楼,字节的大楼中的每一层,地址是楼层编号,位是每一层中的房间,每一层有8个房间。     2.变量的内存   编译器会根据变量的类型,在内存中申请一块空间。不同的编译环境中申请到的空间也不同。例如32位与64位中 int 类型申请到4字节的空间,可以理解为编译器申请了几层楼,作为”办公区域“。 3.指针变量   指针是指程序数据在内存中的地址。在c语言当中,允许用一个变量来存放指针,这种变量称为指针变量。 指针变量只知道楼层号?    存储在指针变量的值,是计算机中的内存地址,也就是“楼层号”。我们在写程序时候,想要让指针指向一个变量,会将一个变量的地址赋给一个指针:   int a;    int * p;   p = &a;  

2隐形的指针

匿名 (未验证) 提交于 2019-12-03 00:34:01
编译器会自动把结构体的地址,通过ecx传到函数内部隐藏创建的一个this指针上. 如果我们的函数,没有返回值,没有使用结构体,编译器还会给我们传递进去吗? 我们来验证一下. 1.this指针是编译器默认传入的,通常会使用ecx进行参数的传递。 2.无论函数有没有使用结构体中的数据,this指针都会存在,你用不用,编译器都会传进去。 3.this指针是编译器隐藏创建的,所以我们起其他变量名或者参数名的时候,一定要避免和this指针重名。 学习过汇编语言和C语言的好处,可以通过这种反汇编的方式,来研究一个语法在内存中的本质。 原文:https://www.cnblogs.com/xiaodaxiaonao/p/9218937.html

内存中堆栈的理解与C++基本语法

匿名 (未验证) 提交于 2019-12-03 00:32:02
一个C/C++编译的程序的内存分配一般为: - 栈区 - 堆区 - 全局区(静态)static: 全局变量和静态变量在一块区域,未初始化的全局变量及静态变量在响铃的另一块区域,程序结束后由操作系统释放 - 文字常量区:字符串存放处,在程序结束后由操作系统释放 - 程序代码区: 函数体二进制代码经过编译后的存放处 例子程序 int a = 0 ; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc" ; 栈 char *p2; 栈 char *p3 = "123456" ; 123456 在常量区,p3在栈上。 static int c = 0 ; 全局(静态)初始化区 p1 = ( char *) malloc ( 10 ); p2 = ( char *) malloc ( 20 ); 分配得来得 10 和 20 字节的区域就在堆区。 strcpy (p1, "123456" ); 123456 放在常量区,编译器可能会将它与p3所指向的 "123456" 优化成一个地方。 } 申请方式 在C++中,stack 由系统自动分配空间,而heap需要自己申请,并指明大小。 p2 = ( char *) malloc ( 10 ) //p2指针对应的地址是一块10字节,储存变量类型为char的内存空间 在申请栈空间时

const用法详解

匿名 (未验证) 提交于 2019-12-03 00:30:01
首先我们来了解一下现在所学的C标准,分别是C89、C99和C++99,C89标准的C语言中的const和C++中的const是有区别的,而在C99标准的C语言中是相同的。我们目前所学的C语言标准为C89标准。 const修饰的量为一个常量即不能被修改的量。但在C语言(C89)中的const可以不初始化但后续也就无法对其赋值,所以尽管不初始化不会出错。但要使用const修饰的量就需要对其进行初始化。另外,既然const修饰的量为一常量那么const修饰的量能不能用作数组的下标? //main.c #include<stdio.h> int main() { const int a = 10 ; //int array[a] = {0};//error C2057: 应输入常量表达式 //则可以得知在C语言中const修饰的量为一个常变量不是常量 int *p = &a; *p = 20 ; printf ( "%d %d\n" , a, *p); return 0 ; //20 20 } 程序输出结果都为20,在这里我们就可以知道常变量和普通变量的区别在于常变量不能用于左值,其余的用法和普通常量一样。在一个工程的多个.c文件中的const修饰的量可以共享。 在C++的代码中const必须初始化,这于const在C++中的编译规则(所有使用常量名字的地方去不替换成常量的初始值)有关。

【C语言】指针的算术运算

匿名 (未验证) 提交于 2019-12-03 00:30:01
之前在学习指针时,我们知道指针其实也是一种变量,既然这样,那么指针应该和普通变量一样,可以进行算术运算。下面我们介绍指针的加减运算。 先看一个实例: #include <stdio.h> int main() { int arr[10] = {1,2,3,4}; int *p = arr; *p = 10; printf("%d\n",*p); p++; *p = 20; printf("%d\n",*p); return 0; } 假设其首地址为1000, 则整个数组对应的地址如下: 图1 数组arr对应地址 图2 修改数组arr首元素的内容 图3 指针p向后移一个数组 十进制的2转化为十六进制为0x00000002。因电脑使用的小端,即低地址存放小数据,如下图所示: 图4 前两个数组元素 图5 指针p加一个字节 arr[1] 修改为20,如图: 指针p加一个单元格 #include <stdio.h> int main() { int *p = (int *)1000; printf("%d\n",p+5);//1020 printf("%d\n",(short *) p+5);//1010 printf("%d\n",(unsigned long *)p+5);//1020 printf("%d\n",(double *)p+5);//1040 printf("%d\n",

c++之this指针

匿名 (未验证) 提交于 2019-12-03 00:29:01
场景: 构造一个A类对象a,当a要调用A类中成员函数时,需要传参,但是却没有像c语言中那样,显式的指定对哪个“目标”进行操作;但结果依然是我们想要的,这是如何做到的呢? 实际上:C++中的成员函数也是按照C类似方式进行处理的,即:成员函 数实际也有一个隐藏指针,指向了调用该函数的对象本身,即this指针 **this是一个指针,它时时刻刻指向这个实例** this指针特性: ①this指针的类型:类类型* const,即不能在类成员函数中修改this的指向 ②this指针并不是对象本身的一部分,不影响sizeof的结果 ③this的作用域在类”成员函数”的内部 ④this指针是”类成员函数”的第一个默认隐含参数,编译器自动维护 传递,类编写者不能显式传递 ⑤只有在类的 非静态 成员函数中才可以使用this指针,其它任何函数都 不可以 __thiscall调用约定: __thiscall只能够用在类的成员函数上 参数从右向左压栈 如果参数个数确定,this指针通过ecx传递给被调用者;如果参数不 确定(_cdecl),this指针在所有参数被压栈后压入堆栈 对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈 this指针是什么时候创建的? 为什么叫this指针,而不是引用呢? this指针存放于何处?堆、栈、全局变量还是其他地方? this指针是如何访问类中的变量的?

c++ 中 const 用法――

匿名 (未验证) 提交于 2019-12-03 00:22:01
为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下: 首先提示的是:在常变量( 常引用( )、常对象( 用法1:常量 用法2:指针和常量 char *const cp; //到char的const指针 char const *pc1; //到const char的指针 const char *pc2; //到const char的指针(后两个声明是等同的) 且注意:允许把非 const 对象的地址赋给指向 const 对象的指针,不允许把一个 const 对象的地址赋给一个普通的、非 const 对象的指针。 用法3:const修饰函数传入参数 void Fun( const A *in); //修饰指针型传入参数 void Fun(const A &in); //修饰引用型传入参数 用法4:修饰函数返回值 用法5:const修饰成员函数 (c++特性) const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数; const对象的成员是不能修改的,而通过指针维护的对象确实可以修改的; const成员函数不可以修改对象的数据,不管对象是否具有const性质

指针及指针变量

匿名 (未验证) 提交于 2019-12-03 00:21:02
指针是C语言中的一个重要概念,也是C语言的一个重要特色,所以学好指针对学好C语言有重要作用。本篇博客就介绍指针和指针变量的相关定义知识。 &a就是得到a的地址,其实“指针==地址”,int *p就是定义一个整型地址(指针)变量 int a=10;//整型变量存放整型值 double b=1.24;//浮点型变量存放浮点型值 int *p=&a;//整型地址变量存放整型地址值 //整型指针变量存放整型地址值 指针在定义时使用的*只是用来说明该变量为指针变量,无其他作用,而在后来的赋值运算中*为间接访问符,是用来解引用的,指针必须有解引用这一步。 int a=10; int *p=&a;//指针p保存了a的地址 *p=100;//把a的值置为100 p=&b;//指针p保存了b的地址 *p=200;//把b的值置为200 上述这段代码执行后的结果如下图: 通俗的理解为指针保存了谁的地址,就对谁解引用,就把谁的值置为几。 如果要对指针p取地址:&p, a--&a: int -- int * p--&p: int * -- int ** --- int **pp=&p;//定义一个指针pp来存放p的地址 所以要对p取地址,就会有两个**。 *pp=&a;//指针*pp保存了a的地址 **pp=1000;//把a的值置为1000 *pp=&b;//指针*pp保存了b的地址 **pp=2000

C与C++的区别

匿名 (未验证) 提交于 2019-12-03 00:21:02
本篇博客对C与C++的区别与联系进行了整理。并对一些校的知识点进行了扩展。 首先我们先来看一看C/C++的联系 C/C++的联系: C是C++的子集,C++兼容大部分的C语言的语法结构 C/C++的区别: 我们都知道C是面向过程的语言,而C++是面向对象 的语言。那 这里我们就要知道 什么是面向对象? 面向对象 是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种优化,操作起来更加的方便,简化了过程。面向对象有三大特征: 封装、继承、多态 ,其中 封装性 指的是隐藏了对象的属性和实现细节,仅对外提供公共的访问方式,这样就隔离了具体的变化,便于使用,提高了复用性和安全性。对于 继承性 ,就是两种事物间存在着一定的所属关系,那么继承的类就可以从被继承的类中获得一些属性和方法;这就提高了代码的复用性。继承是作为多态的前提的。 多态 是说父类或接口的引用指向了子类对象,这就提高了程序的扩展性,也就是说只要实现或继承了同一个接口或类,那么就可以使用父类中相应的方法,提高程序扩展性,但是多态有一点不好之处在于:父类引用不能访问子类中的成员。 特点: 1:将复杂的事情简单化。 2:面向对象将以前的过程中的执行者,变成了指挥者。 3