一个字节是八个比特,所以int在内存中占据32个比特
如果要输出一个变量的地址应该用%p
将i的地址取出来强制变为 int 类型,赋给 p ,其结果和直接取 i 地址出来是一样的
这个结果是在32位的架构下得出的
在64位架构下sizeof(int)是4个字节
而sizeof(&i)这个地址取出来是8个字节
在32位架构下sizeof(int)是4个字节
而sizeof(&i)这个地址取出来是4个字节
地址和整数并不永远相同,这和我们用的架构是有关的
&运算符必须是对一个变量取地址,如果&右边不是一个变量,则不能用&取地址
得有一个明确的变量才能对它取地址
68和6c在16进制下相差4
在C语言中,存储本地内存的地方叫堆栈stack
存储时是自上而下的,所以先定义的变量在上面
两个数组单元之间的差距是4,而且相邻的数组之间的差距永远是4
取地址后把地址交给一个整数,这种方法不见得正确
因为地址的类型不一定能和整数的类型对得上
一个指针类型的变量就是一个保存取出来的地址的变量
* 就代表着是一个指针
* p 就代表p是一个指针,它指向的是这个int,现在我们把这个 i 的地址交给了这个 p
p 里面的值是 i 的地址,这时候我们就说 p 指向了 i
这两行的意思是一样的,都是定义了一个指针 *p 和一个普通的 int 型变量 q
我们并不是把 * 加给了 int 我们是把 * 加给了 p
在C语言中并没有 int* 这种类型
若要表达 p 和 q 都是指针,则要写成 int *p,*q;
指针变量里面只会有别的变量的地址而不是别的变量的值
p 指向 i ,说明 p 能访问 i ,访问即可以对 i 进行读和写
而如果只是普通的变量赋值,则得到的是 i 中的值,而不能对 i 产生什么影响
此时 *p 作为一个整体它是一个整数
在经历了f函数之后, i 的值被改了
p 的值是 i 的地址, *p 就代表了 i ,所以我们能修改 i 的值
scanf以为输入的就是一个地址,所以编译不一定会出错,但是运行一定会出错
因为scanf把值写到了 6 那个地方,而那个地方很小,而且有很重要的东西
其实在函数里面的数组就是指针
不是说这两种类型是等价的,而是说它们在参数表中出现的出现的时候是等价的
p [0] 是指它所指向的值作为数组第一个位置的值
一个数组变量是一个常量指针,所以这个数组变量不能被赋值,两个数组变量之间也不能相互做赋值