首页 > 其他分享 >C初级指针复习

C初级指针复习

时间:2023-05-20 20:13:05浏览次数:42  
标签:复习 指向 右值 左值 初级 内存 cp 指针

C初级指针复习:

内存:

内存中的每一个位置都由一个独一无二的地址标识

每一个内存位置都包含一个值

值和类型:

不能简单地通过检查一个值的位来判断它的类型,为了判断值的类型(以及它的值),必须观察程序中这个值的使用方式,值的类型并非值本身所固有的一种特性,而是取决于它的使用方式

NULL指针:

NULL指针提供了一种方法:可以通过NULL指针表示一个特定的指针目前并未指定任何内容,这一方法可以使得程序返回两个信息:是否存在指定元素?指定元素的位置?但是对NULL指针进行解引用是非法的

指针、间接访问和左值:

间接访问操作符所需要的操作数是个右值,但这个操作符所产生的结果是一个左值

指针常量:

*地址=值

这是非法的,因为地址的数据类型是整数,无法作为左值,需要将其为转为指向整型的指针类型,即int*强转类型,但这种做法是有缺陷的,

左值和右值:

左值标识了一个可以储存结果值的地点,它是指向内存区域的对象,右值则是指定了一个值,它则是内存区域中存储的值,左值意味着一个位置,而右值则意味着一个值,所以在需要使用右值的地方可以使用左值,但反之则不行,左值一般为基本数据类型、指针、数组下标访问成员、枚举类型、结构体类型,右值一般为常量、表达式、const修饰的数据成员、函数名(地址常量)

*操作符具有从右向左的结合性,

指针表达式:

char ch

char* cp

&ch:只能作为右值,作为右值时,表示ch的地址,不能作为左值的原因是ch的地址不确定,不能指定一个特定的位置,或者是不能访问该位置的区域,所以左值不合法

cp:左值和右值均可,左值指的是cp所指的内存位置,右值则是cp的值

&cp:只能作为右值,作为右值时,表示cp的地址值,其类型是指向字符的指针的指针,但是作为左值时,因为其指向的地址位置不确定,所以是非法的

*cp:左值和右值均可,左值指向的位置是cp所指遍历的内存区域,也就是ch,右值则是ch变量的值

*cp+1:解引用操作符优先级高于加号,因此先间接访问cp的值,然后加一得到字符b,因此该表达式的结果只能作为右值使用,而不能作为左值,因为是非法的

*(cp+1):该表达式的含义是间接访问cp指向地址加一的位置,其结果既可以作为左值,也可作为右值

cp++与++cp:只能作为右值使用,作为右值的结果是cp所指内存位置加一的区域,但是作为左值时,因为其结果是一个地址常量,并没有进行访问,所以是非法的

*cp++:解引用操作符和自增运算符结合性相同,都是从右向左,所以先执行后置自增,因此先拷贝cp后自增,结果可作为左值和右值使用

*++cp:与上一个内容同理,这个是先自增后拷贝,结果可作为左值和右值使用,但它访问的位置和内容与上一个不同

++*cp:先执行解引用运算符,访问内存内容,后自增,结果为字符常量,因此只能用于右值

(*p)++:与上一个同理

++*++cp:结合性自右向左,因此最终结果还是字符常量,只能作为右值使用

++*cp++:同理

指针运算:

指针与整数发生加法运算时,会根据指针所指数据类型调整大小,例如定义float*p,p+3其实是相当于加12个字节

(1)算术运算:

指针+(-)整数,这一表达式的结果仍然是指针形式

指针-指针:这一表达式只能应用于指向同一数组的两个指针之间,表达式结果为有符号整数,反映的是两指针之间的距离,因为其结果是通过两指针的差值除于所指向数据类型的大小得到的

(2)关系运算:

关系操作符可以对两个指针值进行比较,不过其前提依然是两个指针指向同一数组,这将用于表示指向数组更前或更后的元素,当然不指向同一数组也是可以的,那么其结果只能体现是否指向同一地址

下面举一例子:

 #define num  5
 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 int main() {
  int array[num];
  for (int* p = &array[0]; p < &array[5]; )
  {
  *p++ = 0;
  }
  return 0;
 }

此代码应用了for。for循环的判断条件是合法的,因为p和&array[5]指向同一数组,事实上&array[5]这一指针常量所指向的是数组最后一个元素后面的那一个内存位置,尽管p指针最终也会指向这一位置,但p并没有间接访问此地址,所以是安全合法的

总结:

计算机内存中的每个位置都由一个地址标识,通常邻近的内存位置合成一组,这样就可以存储更大范围的值

不能通过值的位模式来判断值的类型,类型是通过其使用方式来隐式确定的,编译器能够保证值的声明与使用方式是绑定的,从而保证可以通过值的使用方式来确定值的类型

指针变量的值并非是它所指向的内存位置所存储的值,必须通过间接访问来获得其所指向的内存位置所存储的值,一个指向整型的指针进行间接访问操作后得到的是整型值 声明一个指针变量并不会自动分配任何内存,在对指针进行间接访问时,要对指针进行初始化,要么指向现有内存,要么分配动态内存

NULL指针就是不指向任何东西的指针,赋值指针意味着此指针不指向任何值,对其间接访问结果因编译器而异

除了NULL指针,再也没有任何内建方法的记法来表示指针常量,因为程序员通常无法预知编译器会把变量放在内存中的什么位置,在极少见的情况,需要使用指针常量,这时要强制类型转换为指针类型来创建它

最后,指针可以进行算术和关系运算,不过是一般用于两个指针指向同一数组

 

 

 

·

 

 

 

 

标签:复习,指向,右值,左值,初级,内存,cp,指针
From: https://www.cnblogs.com/alexlance/p/17417712.html

相关文章

  • 软构复习2
    第二章 测试优先的编程测试&debug测试目标:证错  debug:识别错误并改正 测试等级:单元测试:函数级别;集成测试:多个类、包、组件、子系统系统测试:系统 静态测试&动态测试:靠眼睛看&撸起袖子使劲干静态测试:没有执行程序的情况下,检查源代码、语法和数据流动态测试:用给定的......
  • 软件构造复习(一)
    最近在复习软件构造,知识点感觉比较多,有些记不住的就在这里写一下以便回顾,如果有幸能帮到别人那就更好了。测试、异常、健壮性测试测试的等级按被测试部分的规模分为单元测试、集成测试、系统测试、验收测试回归测试:一旦程序被修改,重新执行之前的所有测试 黑盒测试/白盒测......
  • C语言程序设计(第四版)谭浩强版 课后答案 第八章 指针
    1、输出3个整数,按由小到大的顺序输出,写的复杂了,加上分析会变得简单,像下面输出3个字符(从小到大)#include<stdio.h>intmain(){voidcompare(int*a,int*b,int*c);inta,b,c;printf("pleaseinputthreenumbers:");scanf("%d%d%d",&a,&b,&c);c......
  • 函数指针和指针函数
    目录0、摘要1、指针函数2、函数指针3、函数指针数组4、将函数作为传参传入另一个函数5、以下两个指针能分析清楚的话,那么99%的C语言指针问题都难不住你。参考:0、摘要指针函数是返回指针的函数,函数指针是指向函数的指针。int*FunctionReturnsPtr(inta);//返回值为指......
  • 复习之相对导入和绝对导入
    目录一、模块与包的使用模块:包:二、绝对导入和相对导入绝对导入相对导入总结一、模块与包的使用模块:一个py文件,被别的py文件导入使用,这个py文件称之为模块,运行的这个py文件称之为脚本文件包:一个文件夹下有__init__.py二、绝对导入和相对导入再次强调:一定要分清楚谁是执行......
  • golang 指针判断是否为空
    golang判断指针是否为空的方法:1、知道类型的情况下,自然是可以使用类型断言后判空。如ai,ok:=i.(*int),之后判断ai==nil。2、不知道是何种类型的指针,就只好借助反射了vi:=reflect.ValueOf(i),后使用vi.IsNil()来判断。但如果i里放到不是一个指针,调用IsNil会出异常,则可能要写......
  • 关于JVM指针压缩性能的研究
    关于JVM指针压缩性能的研究摘要JVM的内存对消最小是8bytes所以32G内存的情况下可以使用32位的指针就可以了.32位就是4G在乘以最小的内存extent8bytes的出来可以指向32G的内存区域.如果大于32G,那么必须使用64位的指针.理论上会导致非堆区的内存膨胀与性能劣......
  • Java程序设计复习提纲(上:入门语法)
    目录上:基本语法与编译运行数据类型和关键字常用语法数组与字符串异常处理中:面向对象和类下:图形界面基本语法与编译运行java没有指针没有全局变量Java源代码文件的后缀名是".java"。编译后会生成一个或多个字节码文件,后缀名为".class"。Java的编......
  • Java复习
    整理笔记,层次分明智能医学的定义医、理、工高度交叉的学科人类医学发展的三个阶段经验医学、循证医学、智能医学(?)三种思维:医学-科技-融合第一时代是经验医学以个人经验为主,医生根据自己的实践经验、高年资医师的指导、教科书和医学期刊上零散的研究报告为依据来处理患......
  • 数据结构-基本算法复习
    数据结构-基本算法复习第八章排序插入排序直接插入排序:\(O(n^2)\)稳定排序将一条记录插入到已经排序好的有序表中:voidinsertSort(intr[],intlen){for(inti=2;i<=len;i++){if(r[i]<r[i-1]){ intx=r[i];for(in......