指针重温(一)

🔺定义

内存地址的变量。

int a = 3;
int *pa;
pa = &a;  //&为取址运算符,表示取变量a的地址

printf("a = %d\n", a);
printf("*pa = %d\n", *pa);
printf("pa = %p\n", &a);
printf("pa = %p\n", pa);

输出结果:

学习第一步:分清不同变量名最后输出的是什么内容,是地址还是常数。

总结:

a是存放值的变量名,pa是指向变量a的指针变量名,也就是说pa里头存放的是a的地址,所以pa == &a。

*是间接运算符,也可叫做取值运算符,也可叫解引用运算符,所以*pa是取pa存放的地址里存放的值 就是3。

🔺声明指针

声明指针变量时必须指定指针所指向变量的类型。

声明时,*和指针之间的空格可有可无,通常,程序员在声明时使用空格,在解引用时省略空格。

·编写程序时,可以认为变量有两个属性:名称和值(还有其他性质,例如类型,但是暂且不论)。

·计算机编译和加载程序时,变量也有两个属性:地址和值。地址就是变量在计算机内部的名称。

🔺指针和数组

**指针和一维数组

一维数组名是数组首元素地址

int array[4] = {0, 1, 2, 3};
int *parray;
int i;
parray = array;

for (i=0; i<4; i++)
    printf("array[%d] = %d\n", i, *(parray + i));

编译结果:

总结:parray + i 表示 &array[i]

**指针和二维数组

假如有以下的声明:

int zippo[4][2];  /*内涵int数组的数组*/

然后数组名zippo是该数组首元素的地址。

在本例中,zippo的首元素是一个内含两个int 值的数组,所有zippo是这个内含两个int值的数组的地址。

即:当是二维数组时,数组名不再是简单的元素的地址,而是内含多少个元素的数组的地址。

🔺函数、数组和指针

假设要编写一个处理数组的函数,该函数是返回数组中所有元素之和,想象一下原型应该是:

total = sum(marbles);  

marbles 是待处理的数组名,数组名则是一个存放值的地址,所有声明函数的时候应该是给一个指针形式参数:

int sum(int * ar);

 1 /*使用指针算法*/
 2 int sump(int * start, int * end)    //start是数组首元素地址
 3 {
 4     int total = 0;
 5 
 6     while (start < end)   //end是数组末元素地址
 7     {
 8         total += *start;      //把数组元素的值相加
 9         start++;             //让指针指向下一个元素
10     }
11 
12     return total;
13 }

(插入知识点)

*指针操作

①赋值②解引用③取址④指针与整数相加⑤递增指针:让指针移动指向下一个元素

⑥指针减去一个整数:让指针指向左边的元素

⑦递减指针⑧指针求差:可计算两元素间的距离⑨比较:使用关系运算符可以比较两个指针的值,前提是两个指针指向的值是同类型的

 

posted @ 2020-03-19 12:36  樱桃窝窝头  阅读(113)  评论(0)    收藏  举报