标签:
简单一句话,指针就是地址
0:网购的地址,通过这个地址找到你,
程序的地址,通过地址来操作变量,这个地址有一个叫法叫做指针,java 里面把地址就叫做引用
1:内存的单位是字节,例如一个256MB的机器,有256*1024*1024 字节的存储单位,每个字节都有一个对应的地址
通过该地址可以找到该块内存,就像我们的通讯地址一样
#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; }
要去人指针和指针变量:
指针是一个地址。指针变量是保存某一个地址的变量,首先它是一个变量,只不过是保存的地址的。
* 间接访问运算符,存取指定位置的值
变量声明的时候标识该变量是指针,使用指针变量的时候前面加上这个*,标识取该位置的值
<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);
//指针的初始化 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);
// 指针作为函数的参数,在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; }
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; }
标签:
原文地址:http://blog.csdn.net/rodulf/article/details/51902789