简单一句话,指针就是地址
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; }
时间: 2024-10-22 21:30:56