wy今天打了一道高精题,被O(n)的赋值语句导致的TLE虐的体无完肤/(ㄒoㄒ)/~~
然,同机房的神犇P竟用FFT卡过了?!蒟蒻wy表示为此也是操碎了心。。。
无奈之下,懒人wy只好学习一下指针。。。
持续更新中,请勿吐槽。。。。。。
据机房金牌爷Gwy提供的材料,
一个指针包含两方面的含义:
1、存储单元表示的地址
2、指针指向的存储单元的数据类型
&取地址运算符 &a是a变量的地址
* 指针运算符 *p代表指针变量指向的对象
下面做一个试验,
#include<stdio.h> #include<iostream> using namespace std; int main() { int a=100, b=10; int *pa=&a, *pb=&b; printf("a=%d, b=%d\n", a, b); printf("pa=%p, pb=%p\n", pa, pb); printf("*pa=%d, *pb=%d\n", *pa, *pb); }
结果是这样的。。。
指针变量作为函数参数是将一个变量的地址传送到另一个函数中
再来一个试验。。。
#include<stdio.h> #include<iostream> using namespace std; void swap(int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } int main() { int a, b; int *p1, *p2; scanf("%d%d", &a, &b); p1 = &a; p2 = &b; if(a<b) swap(p1, p2); printf("max=%d, min=%d\n", a, b); }
结果如下
在利用指针变量的时候,我们可以改变指针所指向的变量的值,但不可以改变指针的值。
指针变量既可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。
int a[10]={1,2,3,4,5,6,7,8,9,0}; int *p; p = &a[0]; p = a; //上面的两种赋值方法是一样的效果,都是将a数组的第一个元素的地址赋值给p指针。
当指针指向数组元素的时候会出现指针的运算。。。
p++,p--,p+n,p-n,p1-p2(只有当两个指针指向同一个数组的时候才有效)
但是两个指针的相加是毫无意义的。
注意!!!
*p++ (*和p是同级别的,相当于*(p++))
*(p++) 先得到*p的值,然后p++; *(++p) 先p++,然后得到*p的值
++(*p) 如果*p=3, ++(*p)=4
void inv(int x[], int n) { int tmp, i,j, m=(n-1)/2; for(i=0; i<=m; i++) { j=n-i-1; tmp = x[i]; x[i]=x[j]; x[j]=tmp; } return; }
数组名做形参的时候,编译器是当做指针来处理的,所以形参数组内容的改变会改变实参内容。
而且做形参时int x[]一定不能定义大小,因为此时是int x[]一个指针。
2015年7月29日 18:21
跪!
2015年7月31日 19:08
纠错:*p++ 等价于 *(p++)