内存的单位是字节,例如一个256MB的机器,有256*1024*1024 字节的存储单位,每个字节都有一个对应的地址,通过该地址可以找到该块内存,就像我们的通讯地址一样。
每一个变量由若干个字节组成,例如:int age = 20 由 4个字节组成,变量中第一个字节的地址称为变量的地址。#include
int main(int argc,const charchar *argv[]){
int age = 20;
printf("size=%lu\n",sizeof(age));
printf("%p\n",&age);//这个就是输出age的首地址
//1:内存里面的每个字节都有地址
//2:变量的地址是第一个字节的地址(首地址),地址表明了变量在内存中的位置,地址就是指针
//c语言里面只要是说到指针就是指的地址
//3:地址,指针是常量 ,指针变量 = (指针变量)
//4: 指针是有类型的,就是指针类型,JAVA中的地址叫做引用,类型叫做引用类型
return 0;
}
我们将变量的第一个字节的地址称为变量的指针。指针变量是保存某一个地址的变量,首先它是一个变量,只不过是保存的地址的。
&取地址运算符,取变量的地址; * 间接访问运算符,存取指定位置的值。
变量声明的时候标识该变量是指针,使用指针变量的时候前面加上这个*,标识取该位置的值。int a = 100;
int *p=&a;
//*p就是a的别名
//对*p的改变就是对a的改变
//&,*
//& 取地址运算符
int ii=100;
printf("%p\n",&ii);//&i 三个金元宝在哪里啊?地址
int *pp =ⅈ
printf("%p\n",pp);//这里是%p
printf("%d\n",*pp);//*p三个金元宝,注意这里是%d
*pp=80;
printf("%d\n",ii);
ii=200;
printf("%d\n",*pp);
未指向任何变量的指针,称为“悬空指针”其实就是未初始化的指针//指针的初始化
intint *ip;//悬空地址,0x0
printf("%p",ip);
int b = 100;
intint *pb = &b;//初始化
//指针变量pb
//pb 指向了b
//*pb 等价于b
//*pb != pb
intint *p1;
int j = 200;
p1=&j;//赋值
指针的赋值//指针赋值:简单的来说就是地址的拷贝
int q = 100;
intint *pq = &q;
printf("pg=%p\n",pq);
intint *pqp = pq;
printf("pqp=%p",pqp);
*pq = 200;
printf("q=%d\n",q);
printf("pq=%d\n",*pq);
printf("pqp=%d\n",*pqp);
指针作为函数的参数// 指针作为函数的参数,在c语言里面默认的就是使用拷贝的形式来做的,如果想要真的切换两个变量的值,使用swapAddress
int aa = 1,bb = 2;
swap(aa,bb);
printf("aa=%d,bb=%d",aa,bb);
swapAddress(&aa,&bb);
printf("aa=%d,bb=%d",aa,bb);
//交换两个值
void swap(int a, int b){
int temp =a;
a = b;
b=temp;
}
void swapAddress(intint *a,intint *b){
int temp =*a;
*a = *b;
*b=temp;
}
不想改变的参数,使用constant ,类似java 里面的finalvoid test(intint *p){
*p =1000;
}
void testConst(const intint *p){
//如果编译的时候下面的会报错 assignment of read-only location '*p'
//*p =1000;
}
//有的时候不想改变呢?将参数设置为const 类似java 里面的final,
int testp = 100;
test(&testp);
printf("i=%d\n",testp);
testConst(&testp);
printf("i=%d\n",testp);
指针还可以作为返回值//指针还可以作为返回值:
int cc=100,dd=200;
intint *ee = max(&cc,&dd);
printf("最大值为%d",*ee);
intint *max(intint *a,intint *b){
if(*a>*b){
return a;
}else{
return b;
}
}