必须是变量才能取到地址;&必须跟变量
%p是输出十六进制的数
&a=a=&a[0]+4=&a[1] 数组在栈里面a[0]在最下面
计算机的所有东西都是人做出来的
别人能想得出来的,我也一定能想得出来
在计算机里头没有任何黑魔法
所有的东西只不过是我现在不知道而已
总有一天我会把所有内部的细节,所有的东西全都搞明白
*p 表示说p是一个指针
int* p = &i;
通常说是p指向i;实质上是变量p里内容是i所在的地址。
*p是一个指针,不管*靠近谁;
*p这个整体可以表示指针所指向地址上变量的值。
通过*p都可以改变函数外面i里面的值
因为在32位架构中,&i与i的地址是相同的,所以他认为你传了一个地址进去。所以编译不见得会报错。
指针的用处
返回值只能返回一个;所以这里用指针来交换。
从main里面送两个地址进去, 指针他们的作用是把结果带出来,如果不用指针 结果没有办法带出函数。
*result的作用是把结果带出来,而这个函数自己的返回值ret可以来判断这个函数是否成功了。
int *p;
*p=12;
这样的写法是错误的,因为*p里面不可以直接写入东西,他应该是指向某个东西;应该先给地址再赋值。
一个数字当作一个指针 所以不能直接赋值或者与别的数组交换。
p所指向的地址是变量
*p所指地址上变量的值是const;
在*号前面表示*p所指的值是不可修改的
在*号后面是表示指针不可被修改
char数组:一个单元占一个字节 int数组:一个单元占四个字节
给指针加1表示指针指向了后面一个单元的地址,即给指针指向的地址加上一个(char或者int)的字节数
加括号的原因是*是单目运算符,比+的优先级要高,所以要加括号。
指针相减得到的是数据个数的差值,这个个数乘上 seizof(类型),就是地址查。
先取p所指向的值 再给*p加一
之前的遍历程序写法:
用*p++进行遍历先取后加一
手动加一个-1来判断是否遍历完成
想用malloc函数 头文件得加#include<stdlib.h>
内存申请
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
void *p;
int cnt = 0;
while((p=malloc(100*1024*1024))){
cnt++;
}
printf("%dMB\n", cnt);
return 0;
}
有借有还