32位架构 64位架构
地址取加1 字节4个
堆栈存储
存储地址之间序号 也跟变量类型有关
增加也是跟数据类型有关 而不是说加1 地址加1 ( x ) 而是加数据类型所对应的字节
%p(查看地址)
第一种得到地址 第二种只得到值(性质不一样了)
下面第一种不影响 i 第二种影响了i
scanf ("%d", &i) scanf("%d",i) 定义i会给你一个地址 存到地址里面
交换要用指针用
指针 java没有 c语言主要是值做参数 返回-1 和0 出错
这也让c可以在函数里面有一种特殊方式改变值
#include "pch.h"
#include<stdio.h>
int divide(int a, int b, double *res) {
int ret = 1;
if (b == 0) {
ret = 0;
}
else {
*res = a * 1.0 / b; //同时返回两个值 一个用函数返回 另外一个是通过修改地址
}
return ret;
}
int main()
{
int a;
int b;
double c;
scanf("%d %d", &a, &b);
if(divide(a,b,&c))
printf("%d/%d=%f",a,b,c);
else {
printf("代码有误");
}
return 0;
}
常见错误就是定义了指针变量 还没指向任何变量,就开始使用指针 就是下面这种
正确方式
简单的小测试
%p地址输出所对应的符号 也要加&
https://www.cnblogs.com/bingdaocaihong/p/6949891.html
按照我们的理解,int占用4个字节,应该相差4个字节。
这是因为VS在Debug模式下,int变量占用12个字节。
可以这样认为,Debug模式下,在int变量的前后各增加了4个字节,用于存储调试信息。
当我们把模式设为Release,就会发现栈上连续定义的int变量,地址相差4个字节
未赋值的变量 指定的地址可以说是未知的
赋值前后地址的变化 赋值影响地址的设定
数组和指针
通过数组传给一个函数 函数的接受到的数组的状况 导入是一个int * 而非 int
int( *a) == int(a[]) 可以相互替代
*变量加了&反而错了 地址出错