C指针学习(C Premier Plus 学习笔记)
数组和指针:这里 flizny是一个数组。
flizny == &flizny[0]; //数组名是该数组首元素的地址,两者都是常量,在程序的运行过程中,不会改变。但是,可以把数组名赋值给指针变量,然后可以修改指针变量的值。
例: short dates[4]; short *pti; pti = dates; //数组名是数组首元素地址,将地址赋值给指针。
C中,指针加1,指的是增加一个存储单元。对于数组来说,意味着加1后的地址是下一个元素的地址,而不是下一个字节的地址(声明指针时要指向对象类型)。
1 dates + 2 == &dates[2]; //相同的地址 2 *(dates + 2) == dates[2]; //相同的值 3 4 // ar[n] == *(ar+n) 5 6 *(dates+2); //dates 第3个元素的值 7 *dates+2; //dates第一个元素的值加2
datas++ //指针递增,指向数组的下一个元素
函数、数组和指针
处理数组的函数,该函数返回数组中所以元素之和。
total = sum(marbles); //可能的函数调用
其中,数组名marbles是数组首元素的地址,故这个函数传递的是一个地址,因此,函数原型中的形参是一个指针,int sum(int *ar); 实参是地址,则函数原型中的形参是指针。 形参指针,实参地址(数组名)。
sum从该参数获得了该数组首元素的地址
注: 因为数组名是该数组首元素的地址,作为实际参数的数组名,要求形式参数是一个与之匹配的指针。
使用指针形参:
int sum(int *ar, int n);
int sum(int ar[], int n); // 等价的两种表示方法
//sum() 函数使用一个指针形参标识数组的开始(也表明了数组中的数据类型),用一个整数形参表面待处理数组的元素个数。
还有一种方法可以给函数传递信息:传递两个指针,第一个指针指明数组的开始处,第二个指针指明数组的结束处。
int sump(int *start, int *end);
两种循环:
for(i = 0; i < n; i++)
while (start < end) //使用两个指针开始和结束循环
指针表示法和数组表示法:
ar[i] 和 *(ar+i) 等价。ar[i]中的ar是数组名,*(ar+i)中的ar是指针变量。只有当ar是指针变量时,才可以使用ar++这样的表达式。
指针递增表达式:
int data[2] = {100,200}; int moredata[2] = {300,400}; int *p1, *p2, *p3; p1=p2=data; //数组名赋值给指针 p3=moredata; *p1++ = 100; // *p1=200 先使用指针指向位置的值,再递增指针 *++p2 = 200; // *p2=200 先递增指针,再使用指针指向位置上的值 (*p3)++=300; // *p3=301 先使用指针指的值,再将这个值递增
实参和形参
实参用于把值从主调函数传递给被调函数。
被调函数一般不会改变主调函数中的变量,如果要改变,应使用指针作为参数。如果希望把更多的值传回主调函数,必须这么做(用指针)。因为用return语句只能把被调函数中的一个值传回主调函数,要传更多的值,只能使用指针。