sizeof //是一个运算符,给出某个类型或变量在内存中所占据的字节数。
sizeof(int) //算int占字节
sizeof(i) //算 i这个变量占多少
运算符&
作用:获得变量的地址,它的操作数必须是变量
int i; printf(“%x”,&i); //这个是获取i的地址。 得到的结果是在内存中i的地址。但这个是不正确的,获得地址应该用%p.
//32位结构和64位架构的相同变量,所占空间是不一样的
*&不能取的地址:必须要明确的变量就可以。反之,则不能。
对于数组地址 &a=a=a[0]
指针
scanf的工作原理。
指针类型的变量就是保存地址的变量。
int i;
int* p= &i; //p指向了i
int* p,q; //下面两行的意义是一样。都是说p是一个指针变量指向了int i,但是q只是一个普通的int q。*在int边上还是在变量边上都是一样的意思。
int *p,q;
指针变量
变量的值是内存的地址。
普通变量的值是实际的值。
指针变量的值是具有实际值的变量的地址。
作为参数的指针
void f(int *p)
在被调用的时候得到了某个变量的地址。
int i=0; f(&i);
在函数里面可以通过这个指针访问外面的这个i。
#include<stdio.h>
void f(int *p);
int main()
{
int i = 6;
printf("&i=%p\n", &i);
f(&i);
return 0;
}
void f(int *p)
{
printf(" p=%p\n",p);
}
上面代码的图解。
6是值,70是地址。 把i地址的值传给了p。
访问那个地址的变量
“*”是一个单目运算符,用来访问指针的值所表示的地址上的变量。
可以做右值也可以做左值。
int k =*p;
*p=k+1; //这样的做法会使得 p所指地址的内容的值发生改变。
问:为什么 int i; scanf(“%d”,i); 编译不会报错?
对于scanf其实它也是一个函数,对于他而言。他认为,你的i是一个地址,但是你其实给他的是一个值。所以编译会报错,但是运行一定会错。因为scanf把它写错到了一个很奇怪的地方。
指针与数组
如果一个数组传到了函数中,那它组成了什么?
函数参数表中的数组实际上是指针
sizef(a) == sizeof(int*)
但是可以用数组的运算符[]进行运算
数组变量是特殊的指针,数组变量本身表达地址,所以
int a[10]; int *p=a;//无需用&取地址(int *p=&a 没必要)
但是数组单元表达的是变量,需要用&地址,即,*p=&a[1];
同时 a的地址==a[0]的地址
[]这个运算符。可以对数组做,也可以对指针做
p[0] == a[0]
*运算符可以对指针做,也可以对数组做;*a=25;
数组变量是const的指针,所以不能被赋值,两个数组之间不能互相赋值。但是 int b[]; int *q =b; 这样是可以的。因为对于int b 可以看做成 int *const b; 所以他是一个常量,创建出来即不能代表别的数组。