简单一句话,指针就是地址
int *p3 = 100;
如果是直接赋值 int类型的给指针会报错:
invalid conversion from ‘int’ to ‘int*’
0:网购的地址,通过这个地址找到你,
程序的地址,通过地址来操作变量,这个地址有一个叫法叫做指针,java 里面把地址就叫做引用
1:内存的单位是字节,例如一个256MB的机器,有256*1024*1024 字节的存储单位,每个字节都有一个对应的地址
通过该地址可以找到该块内存,就像我们的通讯地址一样
2:每一个变量由若干个字节组成,例如:int age = 20 由 4个字节组成,变量中第一个字节的地址称为变量的地址
#include <stdio.h>
int main(int argc,const char *argv[]){
int age = 20;
printf("size=%lu\n",sizeof(age));
printf("%p\n",&age);//这个就是输出age的首地址
//1:内存里面的每个字节都有地址
//2:变量的地址是第一个字节的地址(首地址),地址表明了变量在内存中的位置,地址就是指针
//c语言里面只要是说到指针就是指的地址
//3:地址,指针是常量 ,指针变量 = (指针变量)
//4: 指针是有类型的,就是指针类型,JAVA中的地址叫做引用,类型叫做引用类型
return 0;
}
2:我们将变量的第一个字节的地址称为变量的指针
要去人指针和指针变量:
指针是一个地址。指针变量是保存某一个地址的变量,首先它是一个变量,只不过是保存的地址的。
3:&取地址运算符,取变量的地址
* 间接访问运算符,存取指定位置的值
变量声明的时候标识该变量是指针,使用指针变量的时候前面加上这个*,标识取该位置的值
<span style="white-space:pre"> </span>int a = 100;
<span style="white-space:pre"> </span>int *p=&a;
<span style="white-space:pre"> </span>//*p就是a的别名
<span style="white-space:pre"> </span>//对*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);
4:未指向任何变量的指针,称为“悬空指针”其实就是未初始化的指针
//指针的初始化
int *ip;//悬空地址,0x0
printf("%p",ip);
int b = 100;
int *pb = &b;//初始化
//指针变量pb
//pb 指向了b
//*pb 等价于b
//*pb != pb
int *p1;
int j = 200;
p1=&j;//赋值
5:指针的赋值
//指针赋值:简单的来说就是地址的拷贝
int q = 100;
int *pq = &q;
printf("pg=%p\n",pq);
int *pqp = pq;
printf("pqp=%p",pqp);
*pq = 200;
printf("q=%d\n",q);
printf("pq=%d\n",*pq);
printf("pqp=%d\n",*pqp);
6:指针作为函数的参数
// 指针作为函数的参数,在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(int *a,int *b){
int temp =*a;
*a = *b;
*b=temp;
}
有的时候不想你改变我的参数,使用constant ,类似java 里面的final
void test(int *p){
*p =1000;
}
void testConst(const int *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;
int *ee = max(&cc,&dd);
printf("最大值为%d",*ee);
int *max(int *a,int *b){
if(*a>*b){
return a;
}else{
return b;
}
}
++++++++++++++++++++++++++++++++++++++++++++++
#include <stdio.h>
//交换两个值
void swap(int a, int b){
int temp =a;
a = b;
b=temp;
}
void swapAddress(int *a,int *b){
int temp =*a;
*a = *b;
*b=temp;
}
void test(int *p){
*p =1000;
}
int *max(int *a,int *b){
if(*a>*b){
return a;
}else{
return b;
}
}
void testConst(const int *p){
//如果编译的时候下面的会报错 assignment of read-only location '*p'
//*p =1000;
}
int main(int argc,const char *argv[]){
int age = 20;
printf("size=%lu\n",sizeof(age));
printf("%p\n",&age);//这个就是输出age的首地址
//1:内存里面的每个字节都有地址
//2:变量的地址是第一个字节的地址(首地址),地址表明了变量在内存中的位置,地址就是指针
//c语言里面只要是说到指针就是指的地址
//3:地址,指针是常量 ,指针变量 = (指针变量)
//4: 指针是有类型的,就是指针类型,JAVA中的地址叫做引用,类型叫做引用类型
//指针变量的声明和指向
//* 表示,后面的变量是指针变量
int i =100;
int *p;//p是int 类型的指针,指针指向的变量的类型,指针保存的额变量地址的类型
p =&i;//这句话,也叫做p 指向了i
printf("int类型指针+%p\n",p);
//&,*
//& 取地址运算符
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);
//指针的初始化
int *ip;//悬空地址
printf("%p",ip);
int b = 100;
int *pb = &b;//初始化
//指针变量pb
//pb 指向了b
//*pb 等价于b
//*pb != pb
int *p1;
int j = 200;
p1=&j;//赋值
//指针赋值:简单的来说就是地址的拷贝
int q = 100;
int *pq = &q;
printf("pg=%p\n",pq);
int *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\n",aa,bb);
swapAddress(&aa,&bb);
printf("aa=%d,bb=%d\n",aa,bb);
//有的时候不想改变呢?将参数设置为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;
int *ee = max(&cc,&dd);
printf("最大值为%d",*ee);
return 0;
}