AutoLeaders控制组——指针笔记

                                           指针      

前言   取地址运算

     1.输入与输出地址

             &是一个取地址运算符,可以获得一个变量的地址,它的操作数必须是变量。如

int i;
scanf("%d",&i);

              输出时,需用到%p以十六进制的样式输出其地址。(此时,与平常不同,变量的前面需要记得一个&。)如

printf("%p",&i);

 2.取地址时的一些情况

             &不能对没有地址的东西取地址。如&(a+b),&(a++),&(++a)。

             当对两个相邻变量取地址时可以发现,在32位的架构下两个变量的地址相差”4“(一个sizeof(int)),且先定义的变量数值较小

             当对数组取地址时可以发现,若定义一个数组a[10],分别对a,a[0[,a[1]取地址,则a的结果与a[0]相同,两者与a[1]相差一个sizeof(int)

1. 什么是指针?

     1.1 概念

             指针是一种特殊的变量,能够记录内存里的一个地址。跟其他变量一样,使用他之前都要先声明。

int *p=0;(说明指针所指向的是int型变量)
int **p=0;(说明指针所指向的是一个指针变量)
int *p,*i;(定义两个指针)

     1.2 指针的大小,指针的类型,指针指向的类型,指针的值。

             指针在32位架构下是4个字节,在64位架构下是8个字节。可以用sizeof函数测出。(即地址的大小是否与int相同取决于编译器)

             指针本身有类型,如int*,char*等,不同类型的指针是不能直接赋值的。指针指向的变量也有类型,如int,char等。两者是不同的概念,不应混淆。

             另外,若对一个int*的指针+1,将会移动4个字节,对一个char*的指针+1,将会移动1个字节。(类似一个“单位”)

             指针的值,即指针所指向的地址。若指针未初始化,则指针所指向的内存不存在。

2.指针有什么用?

      2.1交换两个变量的值

             本来在一个函数里所做的操作,当返回到另一个函数里的时候,将会变的无效,能从函数里返回来的只有一个返回值。而有了指针之后,我们可以直接在地址上“做文章”,这在一个就使得函数里所做的操作可以返回到另一个函数,比如可以做到简单的交换两个变量的值。如

      2.2函数返回多个值

             因为函数只能返回一个返回值,若要返回多个值,某些值就只能通过指针返回,而传入的参数实际上是需要保存带回的结果的变量。如在一个找最大最小值的情况下我们需要函数返回两个值,则可以用指针办到。

 实际上,我们可以让函数返回运算的状态,而结果通过指针返回,将两种返回值“分类”以达到便利高效的结果。如

3.指针与数组

     3.1指针和数组的关系

             函数参数表上的数组实际上是指针,数组的数组名其实可以看作一个指针。数组变量是特殊的指针,数组变量本身表达地址,所以取地址时无需用&取地址。但是数组的单元表达的是变量,需要用&取地址。

             另外,a==&a[0];,a的地址就等于a[0]的地址。

             [ ]运算符可以对数组做,也可以对指针做。

若 int *p=&a;
则 p[0]=*p;

             反过来,*运算符可以对指针做,也可以对数组做。

若 a[0]=1;
则 *a=1;

             实际上,数组变量是const的指针,它不能被赋值。

4.指针运算

     4.1运算

             指针可以加上或减去一个整数(+,+=,-,-=),也可以递增递减(++,--),但不能乘除。与平常的加减不同对指针加减是让其加减一个“单位”,即一个sizeof(变量类型)的字节。

int a[]={0,1,2};
int *p=a;

p==a[0];\\即等于0
p+1==a[1];\\即等于1

             类型相同的指针和指针也可以相减,但不能进行相加。得到的值是两个地址的差与sizeof(变量类型)的商。

             指针之间也可以比较如<,<=,==>,>=,!=都可以对指针做。两个指针做比较,比较的是它们在内存的地址。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值