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;
}
动态分配内存
解决数组定义必须指定长度的局限性