指针的初始化
#include<stdio.h>
main(){
int i=222;
int *p;
p=&i;
printf("*p=%d\n",*p);
printf("p=%d\n",p);
printf("&i=%d",&i);
}
P为指针的名字,他是地址,故给P赋值时,应该用变量的地址。
在P前面加*,就可以得到地址所对应的值。
指针数组
可以直接对p执行指针算术运算来访问数组
#include<stdio.h>
main(){
int a[10];
int *p;
for(int i=0;i<10;i++){
a[i]=i;
}
p=&a[0];
p++;
p++;
printf("%d",*p);
}
数组名做指针
在C中,数组名即为指向数组第一个元素的指针,但是该指针不能进行赋值。
#include<stdio.h>
main(){
int a[10];
for(int i=0;i<10;i++){
a[i]=i;
}
printf("%d",*a);
}
指针与多维数组
使用指针访问多维数组可以只使用一个循环
#include<stdio.h>
main(){
int a[5][5];
int *p;
int x=0;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
a[i][j]=x;
x++;
}
}
for(p=&a[0][0];p<=&a[4][4];p++){
printf("%d",*p);
}
}
处理多维数组的行
int a[10][10];
int *p; p = &a[i][0];
// 此时p指向第i行
// p 进行自增是按照 p 的类型
// 此时 p 是 int 类型,自增 +1 实际地址 +4
p = a[i];
//这样的写法也是合法的
处理多维数组的列
int a[10][12], (*p)[12], i;
for (p = &a[0], p < &a[10]; p++){
(*p)[i] = 0;
}
// 此时 p 是一个指向长度为12整数数组的指针(单个指针)
// 如果写成 *p[12] 则是一个指针数组(数组)
// p++移动则是移动一整行
注意:
(*p)[12]——是一个指针,P指向一个长度为12的数组。
*p[12]——是一个数组,数组内部包含了12个指针,指向哪里不知道。