指针——内存和地址

刚刚看了篇博文: 北大硕士开米粉店,3个月后的最大收获与感悟是

里面的一些词,让我很触动,很有共鸣感,

“书生式的无病呻吟”:确实,好像有很多时候觉得自己已经很苦逼了,可是看看那些在社会上用自己的双手为生计打拼的人,拿着国家津贴,父母的钱,却连最基本的学习都觉得苦,真是羞得无地自容啊!

“理解和尊重”。。。不说废话了,下面记叙C语言的指针,一来知道指针是C语言的灵魂,二来,近来学习数据结构和算法,里面有很多指针的操作,理解还是有点困难呀!

1.计算机的内存由位(bit)组成,每个位可以容纳值0和1.

即:计算机内存的最小单位就是:位(bit)

2.现实计算机的内存以字节(byte)为单位(bit太小啦!),每个字节8位,存储无符号值:0~255,或有符号值:-128~127

3.指针的声明:int *p = &a (要死这都快忘了,p的值是a的地址,*p是a的值,其实可以拆成两句:int *p;(声明一个指针变量)p = &a;(指针变量赋值))

4.变量的值就是分配给该变量内存位置所存储的数值。(爱死这句话 )

5.指针一定要初始化,即给定它所指向的位置。一般初始化:int *p;p = NULL(表示特定指针P目前并未指向任何东西。)(当不确定指针指向何地址,

如果地址确定,则将p直接赋值为该地址)

6.p = 10 -*p 是非法的,因为它将一个整形数量(10-*p)存储与一个指针变量中。

7.假定a存储于位置100,则*100 = 25;

注意!注意!注意!(时至今日才明白这点)

这个表达式是非法!理由:指针操作是间接访问的方式,而间接访问操作只能作用于指针类型表达式,而字面值100的类型是整型。!不是指针类型!

如果你想把25存储与位置100,则必须使用强制类型转换。

*(int *)100 = 25(这种方法基本不用,也不建议使用)

8.指针的指针(其实指针啊指针啊,也就是指针变量,归根结底就是个变量,先声明,在定义。

没有什么太大的不同,只是指针变量的存放的是其他数据的地址值而已,也就是隐性的存在一种指向关系,间接访问)

指针的指针,一层层的剥,首先它是一个指针,其次复杂的,它指向的也是一个指针啦!

哎呀妈呀,想画张图,结果又一次发现自己是弱爆了!

还是先上干巴巴的代码先:

int   a = 12;
int   *b = &a;
int   **c = &b;   #*操作符具有自右向左的结合性

代表的意义:

表达式 相当的表达式
a 12
b &a
*b a,12
c &b
*c b,&a
**c *b,a,12

9.&a不能作为左值。优先级表格显示&操作符的结果是个右值,它不能当作左值使用。

理由:当表达式&a进行求值时,它的结果应该存储于计算机的位置是未知的。这个表达式并未表示任何机器内存的特定位置,因此无法对其进行赋值。

暂且记下这么多,指针博大精深。。有待更加深究。。

时间: 2024-07-29 17:25:01

指针——内存和地址的相关文章

[转]解读C指针(1)——内存与地址

原文地址:http://blog.csdn.net/czmpersist/article/details/9288203 计算机现在功能虽然强大,但究其实质是0与1的变换,循环往复,以至无穷,故能成其大.正如老子所说“一生二,二生三,三生万物”.“世界万物生于有,有生于无”.所以在学习计算机课程的过程中,要劳劳掌握基础知识,掌握根本,然后再去求变,才能以不变应万变,方为上策. 内存与地址 在介绍指针之前,先让我来讲一讲计算机内存与地址.计算机内存可以看作是一辆火车,我们知道火车有很多节车厢,每一

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名(转)

1.指针与引用的区别: 指针是一块内存的地址值,而引用是一块内存的别名. 下面引自:http://www.cnblogs.com/kingln/articles/1129114.html 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一

打印指针指向的地址值

废话不多说,直接上错误代码: static void print_cpu_src(uint8_t * src,int stride){ int i,j; printf("Magnum cpu src addr == %p, stride ==%d:\n",&src,stride); for (i = 0; i < 11; ++i) { printf("\n"); for (j =0; j < 4; ++j) { printf("%d ,

C语言 内存和地址

内存与地址 在介绍指针之前,先让我来讲一讲计算机内存与地址.计算机内存可以看作是一辆火车,我们知道火车有很多节车厢,每一节车厢都有车厢编号(坐过火车的人都知道),每一节车厢就可比喻为计算机的一块内存,车厢里面有座位号,通过座位号就可以唯一的确定一个座位,座位号就好在这一个内存块的偏移量,通过它可以唯一确定的数据存储的位置. 注意,内存中的每个位置由一个独一无二的地址标识,内存中的每个位置都包含一个值. 现在举例说明内存中数据存储,如下表,表中加粗边框部分表示内存中实际存储的数据,无边框部分表示内

python 深浅复制与指针内存

Python是一门很好的语言,他的优点在于拥有巨大灵活性的同时也拥有无比的严谨性,其他语言规定了很多语法,告诉你什么情况下,语法就是这样的,而Python却用很少的规定,延伸出很多语法,有些语法看上去很奇怪,仔细分析却是那么的合理.今天思考了Python中关于指针和深浅复制的问题,下面希望能通过根据内存空间的变化对这些让人头疼的问题作出一个解释. 首先看第一个例子: a = 1 b = a b = 2 print 'a = %s' %a, 'b = %s'%b 结果:a = 1 b = 2 当执

go之变量、指针、引用地址

一.值类型 定义和说明 定义:变量直接指向存在内存中的值,我们称之为值类型. 值类型的变量的值存储在栈中. 值类型 将一个变量赋值给另一个变量 被称为值拷贝 实例 package main import "fmt" func main(){ var num1,num2 int num1 = 10 num2 = num1 // 值类型赋值操作 fmt.Println(num1,num2) // 10 10 num1 = 20 fmt.Println(num1,num2) // 20 10

指针*和取地址&amp;函数输入使用

函数输入问题: 1 带&和不带& (参数本身还是拷贝一份参数) 2 函数输入指针 #include <iostream> using namespace std; int main( ) { void swap(int *p1,int *p2); //函数声明 int *pointer_1,*pointer_2,a,b; //定义指针变量pointer_1,pointer_2,整型变量a,b cin>>a>>b; pointer_1=&a; //

空指针——野指针——内存泄漏

转自https://blog.csdn.net/jackshiny/article/details/43838919 空指针: 一般声明一个指针变量赋值为NULL,这就是空指针,各个类型的空指针都存在确确实实的内存地址,但是不会指向任何有效的值的内存地址,对空指针操作,例如访问属性和方法,会抛出空指针异常,因为空指针指向的内存地址没有对应的物理地址. 野指针: 指那些释放内存,但是指针赋值为空,这时候的指针指向任意地址,好可怕,例如指向内核地址或不属于本程序的内存地址,程序会被kill,即奔溃.

Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争

2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在的问题.其最大的特点在于保持较高的运行效率.深入的底层控制和广泛应用范围的同时,解决了传统C语言和C++语言中的内存安全问题.2009年,Mozilla接手Rust项目,创建了以Graydon为首的专业全职开发团队,并且开放了该项目的源代码.2012年1月,第一个面向公众的预览版本--v0.1 发布