1.指针的声明与初始化
- &取址运算符
- *取值运算符
- 一元运算符*和++具有相等的优先级,但它在结合是是从右往左进行的。*a++是指针自加1而不是指针所指数据自增1。
int data[2]={100,200};
int moredata[2]={300,400};
int main(void){
int *p1,*p2,*p3;
p1=p2=data;
p3=moredata;
*p1 = 100,*p2 = 100, *p3 = 300
*p1++ = 100,*++p2 =200,(*p3)++ = 300
- 可以把“*”想成“&”的反向操作 eg: a=*&b就相当于a=b
- 指针的声明 int *p; 指针的初始化 p=&a;
- 声明指针的同时进行初始化 int *p=&a;
- printf(%d ,*p);打印的是a的值而不是a的地址;
- 打印地址是%p
2.指针的赋值
- 任意数量的指针可以指向同一个对象。
- 数组名可以直接作为指针变量地址。
- 通过指针的传递,可以改变被传递参数的值。如方法:调用:test(&c,&d); void test(int *a,int *b){}。
- 使用const可以保护实际参数不能被改变 void test(const int *a){} 我们不能改变指针a指向的整数。但是可以改变a本身。 void test(int *const a){} 这样就可以保护a本身。
3.指针的操作
- 赋值:可以把一个地址赋给指针。通常使用数组名或地址运算符&来进行地址赋值。
- 求值:运算符*可以取出指针指向地址中存储的数值。如*a=100.
- 取指针地址:指针变量同其他变量一样具有地址和数值,使用运算符&可以得到存储指针本身的地址,而不是指向数据的地址。
- 将一个整数加给指针:可以使用+运算符来吧一个整数加给一个指针,或者把一个指针加给一个正数。两种情况下,这个整数都会和指针所指类型的字节数相乘,然后所得到的结果会加到初始地址上。如:int urn[];*ptr= urn;ptr+4的结果等同于&urn[4].
- 增加指针的值:可以通过一般的加法或增量运算符来增加一个指针的值。对指向某数组元素指针做增量运算,可以让指针指向该数组的下一个元素。ptr++就是urn[1]。
- 从指针中减去一个整数:可以使用-运算符来从一个指针中减去一个整数。指针必须是第一个操作数,或者是一个指向整数的指针。这个整数都会和指针所指类型的字节数相乘,然后所得到的结果会从初始地址中减掉。
- 减小指针的值:它将不会指向当前元素 的值,而是指向前一个元素的值。
- 求差值:求出两个指针间的差值。通常对分别指向同一个数组内两个元素的指针求差值,以求出元素之间的距离,差值的单位是相应类型的大小。若为int型,就是几个int数值的大小,而不是几个字节。有时也会导致运行错误而不是返回 一个值。
- 比较:可以使用关系运算符来比较两个指针的值前提是两个指针具有相同类型。