-- 作者:admin
-- 发布时间:2015/11/28 9:20:23
-- [推荐]第九课代码讲义:指针
int main() { int i=0; int *p=&i; *p=1; printf("%d\\n",i); printf("%d\\n",p); printf("%d\\n",*p); printf("%d\\n",&i); return 0; }
为什么要使用指针?获取了从其他地方改变当前变量的一种能力 int main() { int i=0; func(&i); printf("%d",i); return 0; }
void func(int *p) { *p=1; }
这并不违背形参改变不影响实参
思考:为什么scanf使用&符号而printf不使用呢?
使用函数交换数据 int main() { int i=0,j=1; printf("i=%d,j=%d\\n",i,j); func(&i,&j); printf("i=%d,j=%d\\n",i,j); return 0; }
void func(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; }
指针访问数组 #define LEN 10
int main() { int i; int array[LEN]= {0}; int *p=&array[0]; *(p+1)=2; for(i=0; i<LEN; i++) { printf("%d\\t",array[i]); } return 0; }
等价写法(数组名称就是指针): #define LEN 10
int main() { int i; int array[LEN]= {0}; int *p=array; p[1]=2; for(i=0; i<LEN; i++) { printf("%d\\t",array[i]); } return 0; }
但是不能这样使用: int main() { int i; int *array={0,0,0,0}; for(i=0; i<4; i++) { printf("%d\\t",array[i]); } return 0; }
所以数组名称作为函数参数的情况,应该考虑和指针等价 #define LEN 10
int main() { int i; int array[LEN]={0}; func(array); for(i=0; i<LEN; i++) { printf("%d\\t",array[i]); } return 0; }
void func(int array[]) { array[1]=1; }
等价写法: #define LEN 10
int main() { int i; int array[LEN]={0}; func(array); for(i=0; i<LEN; i++) { printf("%d\\t",array[i]); } return 0; }
void func(int *p) { *(p+1)=1; }
结合++运算符可以更为简单的访问数组(不再使用i) #define LEN 10
int main() { int array[LEN]= {1,2,3,4}; int *p; for(p=array; p<array+LEN; p++) { printf("%d\\t",*p); } return 0; }
#define LEN 10
int main() { int array[LEN]= {1,2,3,4}; int *p=array; while(p<array+LEN) { printf("%d\\t",*p++); } return 0; }
二维数组的指针: int main() { int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int *p; p=array; printf("%d\\n",*p);
p=&array[0][0]; printf("%d\\n",*p);
p=array[1]+1; printf("%d\\n",*p);
p=&array[0]; printf("%d\\n",*p);
p=&array[2]; printf("%d\\n",*(++p));
p=array+2; printf("%d\\n",*(++p)); return 0; }
有了指针可以一维的访问数组元素 为什么有问题? int main() { int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int *p=array; while(p<array+12) { printf("%d\\t",*p++); } return 0; }
正确方法是:while(p<array[0]+12)
指针字符串 int main() { char string1[]="Hello World!"; puts(string1); char *string2="Hello World!"; puts(string2); string1[5]=\'*\'; puts(string1); //string2[5]=\'*\'; return 0; } 注意第二种方法不能改变字符串
可以使用指针循环的方式遍历字符串(复制) int main() { char string1[]="Hello World!"; char string2[100];
char *p1=string1,*p2=string2; while(*p1!=\'\\0\') { *p2++=*p1++; } *p2=\'\\0\'; puts(string2); return 0; }
返回值为指针的函数(慎用) int main() { int * func(); int *p=func(); printf("%d\\n",*p); *p=1; printf("%d\\n",*p); return 0; }
int * func() { int i=0; return &i; }
指针数组 int main() { int array[3][4]= {1,2,3,4,5,6,7,8,9,10,11,12}; int *p[3]; int i=0; for(i=0; i<3; i++) { p[i]=array[i]; }
printf("%d\\t",p[1][0]); return 0; }
指向指针的指针 int main() { int array[3][4]= {1,2,3,4,5,6,7,8,9,10,11,12}; int *p[3]; int i=0; for(i=0; i<3; i++) { p[i]=array[i]; }
int **p1=&p[0]; printf("%d\\t",p1[1][0]); return 0; }
动态分配内存 解决数组定义必须指定长度的局限性
|