首页 > 其他分享 >C和指针:指针

C和指针:指针

时间:2024-09-19 12:52:01浏览次数:10  
标签:ch 右值 左值 地址 cp 指针


内存和地址

程序视角看内存是一个大的字节数组,每个字节包含8个位,可以存储无符号值0至255,或有符号值-128至127。

C和指针:指针_操作符

多个字节可以合成一个字,许多机器以字为单位存储整数,每个字一般由2个或4个字节组成。

C和指针:指针_c语言_02

由于它们包含了更多的位,每个字可以容纳的无符号整数的范围是从0至4294967295(2^32-1)。尽管一个字包含了4个字节,它仍然只有一个地址。

它的地址是最左边字节或者最右边字节的位置,不同的机器有不同的规定。另一个需要注意的是边界对齐(alignment)。要求边界对齐的机器上,整型值存储的起始位置只能是特定的字节,通常是2或4的倍数。

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

内存中的每个位置都包含一个值。

C和指针:指针_操作符_03

如果知道一个值的存储地址,可以根据地址取得这个值。但是地址不好记,所以可以通过变量名访问地址的值。

C和指针:指针_右值_04

名字与内存位置之间的关联并不是硬件所提供的,是由编译器实现的。

int a = 112,b = -1;
float C = 3.14;
int *d = &a;
float *e = &C;
值和类型

c声明为浮点数,但是存放在内存中使用的整数,它们可以被解释为整数,也可以被解释为浮点数,取决于它们被使用的方式。如果使用的是整型算术指令,这个值就被解释为整数,如果使用的是浮点型指令就是浮点数。

不能检查一个值的位来判断类型。为了判断值的类型,必须观察程序中这个值的使用方式。

指针变量的内容

指针变量存放指针指向变量的地址。

d和e的内容是地址而不是整型或浮点型数值。d的内容与a的存储地址一致,而e的内容与c的存储地址一致,

间接访问操作符

通过一个指针访问指向的地址的值间接访问或解引用指针,间接访问的操作符*。

*d=112

*e=3.14

C和指针:指针_整型_05

*&a = 25;

把值25赋值给变量 a。

&产生变量 a的地址,它是一个指针常量。*操作符访问其操作数所表示的地址。表达式中操作数是a的地址,所以值25就存储于 a中。

*(int *)100= 25

强制类型转换把值100从“整型”转换为“指向整型的指针",对它进行间接访问。如果 a存储于位置100,那么这条语句就把值25存储于a。

需要通过地址访问内存中某个特定的位置,它并不是用于访问某个变量,而是访问硬件本身。

未初始化和非法的指针

下面的指针a没有初始化就进行赋值,是非法的。a存放的是一个随机的整数,行为未定义。

int*a;
*a = 12;
NULL指针

NULL指针是一个特殊的指针变量,表示不指向任何东西。要使一个指针变量为NULL,可以给它赋一个零值。为了测试一个指针变量是否为NULL,你可以将它与零值进行比较(源代码约定)。

NULL指针并未指向任何东西,因此对NULL指针进行解引用操作是非法的。在对指针进行解引用操作之前,首先必须确保它并非NULL指针。

指针的指针

int a=12;int *b=&a;int **c=&b;

c的类型是一个指针,b是指向整型的指针,c是一个指向整型指针的指针。

指针表达式

char ch= ’a’;char *cp=&ch;

C和指针:指针_右值_06

?为ch后面的内存位置(方便后续使用)。

ch

作为右值使用表示表达式的值为'a'

C和指针:指针_c语言_07

作为左值使用表示内存的地址而不是该地址所包含的值。

C和指针:指针_右值_08

&ch

作为右值表示变量ch的地址,这个值等于变量cp存储的值。

只能作为右值,不能作为左值。

C和指针:指针_右值_09

cp:右值是cp的值(存放ch的地址),左值是cp所处的位置(左值一般是等号左面用作赋值)。

C和指针:指针_c语言_10

&cp:右值表示取指针变量的地址,指向字符指针的指针。左值非法。

C和指针:指针_整型_11

*cp:右值表示间接访问ch‘a’。左值表示ch的地址

C和指针:指针_c语言_12

*cp+1

右值:*优先级高于+,所以执行间接访问操作,得到值‘a’,+1后得到’b’。

左值:非法

C和指针:指针_整型_13

*(cp+1)

右值表示?的值。左值表示?的地址

C和指针:指针_整型_14

++cp

右值:表达式的结果是增值后的指针的一份拷贝。执行后cp指向?

左值非法

C和指针:指针_右值_15

cp++

右值:增加cp的值,执行后cp指向?。但先返回cp值的一份拷贝再增加cp的值。表达式的值式cp原来值的一份拷贝。左值非法。

C和指针:指针_整型_16

*++cp

右值:间接访问操作符作用再增值后的指针的拷贝上,表示?的值。

左值:表示?内存地址。

C和指针:指针_c语言_17

*cp++

右值和左值分别是变量ch的值和ch的内存位置。cp指向?

后缀++操作符的优先级高于*操作符。

C和指针:指针_操作符_18

(1)++操作符产生cp的一份拷贝.

(2)++操作符增加 cp的值.

(3)在cp的拷贝上执行间接访问操作.

++ *cp

右值表示ch变为b,左值非法

C和指针:指针_整型_19

(*cp)++

与12类似,结果是ch增值前的值(‘a’),但是ch的值变为’b’。

C和指针:指针_整型_20

++*++cp

C和指针:指针_操作符_21

*++cp,需要做的只是增加它的结果值。

指针运算

当一个指针和一个整数量执行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。合适的大小就是指针所指向类型的大小,调整就是把整数值和合适的大小相乘。

C和指针:指针_操作符_22

算术运算

(1)指针士 整数

指向数组中某个元素的指针

#define N_VALUES 5
float values[N_VALUES]; 
float *vp;
for( vp = &values[0]; vp< &values[N_VALUES];)
*vp++ = 0;

for语句的初始部分把 vp指向数组的第1个元素。

C和指针:指针_右值_23

经过第1次循环之后

C和指针:指针_右值_24

经过5次循环之后,vp就指向数组最后一个元素后面的那个内存位置。

C和指针:指针_右值_25

(2)指针 一 指针

C和指针:指针_整型_26

只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针,两个指针相减的结果的类型是 ptrdiff_t,它是一种有符号整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。

关系运算

指针都指向同一个数组中的元素可以进行关系运算,判断哪个指针在数组的前面或后面。

标签:ch,右值,左值,地址,cp,指针
From: https://blog.51cto.com/u_16969274/12055951

相关文章

  • 【C总集篇】第八章 数组和指针
    文章目录第八章数组和指针数组数组回顾初始化数组初始化数组介绍初始化失败案例部分初始化自动匹配数组给数组赋值数组边界指定数组大小多维数组二维数组的定义二维数组的初始化指针与数组函数数组与指针函数数组与指针初了解使用指针形参指针操作八种基本指针......
  • C和指针:结构体(struct)和联合(union)
    结构体和联合结构体结构体包含一些数据成员,每个成员可能具有不同的类型。数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。结构声明在声明结构时,必须列出它包含的所有成员。struct......
  • C和指针:动态内存分配(malloc,calloc,realloc,free)
     动态内存分配⭐关联知识点:linux动态内存分配为什么使用动态内存分配声明数组必须用一个编译时常量指定数组的长度。但是,数组的长度常常在运行时才知道,由于它所需要的内存空间取决于输入数据。malloc和freemalloc和free,分别用于执行动态内存分配和释放。这些函数维护一个可用......
  • C和指针:字符串
    字符串、字符和字节字符串基础字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。字符串长度就是字符串中字符数。size_tstrlen(charconst*string);string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。#include......
  • 【快慢指针】突破环形链表
      ......
  • C和指针:标准函数库
    整型函数算术<stdlib.h>intabs(intvalue);longintlabs(longintvalue);div_tdiv(intnumerator,intdenominator);ldiv_tldiv(longintnumer,longintdenom);abs函数返回它的参数的绝对值.div函数把它的第2个参数(分母)除以第1个参数(分子),产生商和余数,用一......
  • C++中一般指针,指针数组,数组指针
    凤凰台上凤凰游,凤去台空江自流。吴宫花草埋幽径,晋代衣冠成古丘。三山半落青天外,二水中分白鹭洲。总为浮云能蔽日,长安不见使人愁。                            ——《登金陵凤凰台》【唐】李白 今天是中秋节,小......
  • Rust有指针类型数据吗?是否可以查看一个变量的内存地址?
    在Rust中,虽然不像C/C++那样直接使用传统的指针类型,但Rust依然有指针的概念,且提供了多种安全的方式来操作和管理内存。你可以通过一些Rust的特性查看变量的内存地址并安全地进行指针操作。1.引用(References)Rust的引用(&和&mut)可以理解为一种安全的、受所有权规则和借......
  • 算法学习每日一题之2332. 坐上公交的最晚时间:二分答案 & 贪心双指针
    Problem:2332.坐上公交的最晚时间人话题意:你是一个懒惰的人,虽然你要赶公交车,但你想多睡会,恰好你知道每辆车的发车时间buses和每辆车容capacity,和每个乘客乘车的时间passenger,旨在求可以赶上公交车的最晚出发时间。思路一:二分答案求最晚能满足赶上公交的时间,可以发现......
  • 【C语言从不挂科到高绩点】19-指针01【重点知识】
    Hello!彦祖们,俺又回来了!!!,继续给大家分享《C语言从不挂科到高绩点》课程!!本节将为大家讲解C语言中非常重要的知识点-指针:本套课程将会从0基础讲解C语言核心技术,适合人群:大学中开设了C语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想要从事C/C++/嵌......