指针
认识指针
声明一个名为i_pointer的指针 将变量i的地址取出来,赋值给i_pointer指针
两个指针操作符
将i取地址赋值飞pointer指针,然后再打印pointer指针。值为2000
指针与指针变量
可以把“指针”想成指针变量的索引(地址),而指针变量跟int i 中的变量一样
定义一个指针变量
将pointer_2中储存变量j的地址赋值给pointer_1,然后pointer_1得到变量j的地址,从而指向变量 j
注意:不要将整数或者其他非地址类型的数据赋值给指针变量,否则编译器会把它当做地址处理
代码分析1
int main()
{
int a, b;
int *p1, *p2;
a = 100; b = 10;
p1 = &a;
p2 = &b;
printf("%d,%d\n",a,b);
printf("%d,%d\n", *p1, *p2);
}
result:
100,10
100,10
请按任意键继续. . .
int类型的变量a和变量b以及变量指针,ok;
将变量a的地址赋值给p1,将变量b的地址赋值给p2,ok;
打印变量a和变量b的值;是取值操作符,p1本指向a,然后就是将a的值取出来了,,p2本指向b,然后就是将b的值取出来,ok.相当于通过&获得地址,然后用 将所指变量的值取出来。ok
代码分析2
输入两个整数,从一大一小排列(指针)
int main()
{
int a, b;
int *p1,*p2,*p;
scanf("%d %d", &a, &b);
p1 = &a;//p1指向a
p2 = &b;//p2指向b
if (a < b)
{
p = p1;
p1 = p2;
p2 = p;
}//每人只能持有一张门牌号否则会遭天谴,3个人ABC,其中2个人想交换门牌号。A现将门牌号给C,B再将门牌号给A,C再将门牌号给A
printf("%d,%d\n",a,b);
printf("%d,%d\n", *p1, *p2);
}
result:
5 6
5,6
5,6
请按任意键继续. . .
代码分析3
输入三个整数,从一大一小排列(指针)
int main()
{
void exchange(int *q1, int *q2, int *q3);
int a,b,c;
int *p1,*p2,*p3;
scanf("%d %d %d", &a, &b,&c);
p1 = &a;
p2 = &b;
p3 = &c;
exchange(p1, p2, p3);
printf("%d,%d,%d\n",a,b,c);
printf("%d,%d,%d\n", *p1, *p2,*p3);
}
void exchange(int *q1, int *q2, int *q3)
{
void swap(int *pt1, int *pt2);
if (*q1 < *q2)
{
swap(q1, q2);
}
if (*q1 < *q3)
{
swap(q1, q3);
}
if (*q2 < *q3)
{
swap(q2, q3);
}
}
void swap(int *pt1, int *pt2)
{
int temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
printf("%d,%d\n", *pt1, *pt2);
}
result:
1 5 99
5,1
99,5
5,1
99,5,1
99,5,1
请按任意键继续. . .
指针与数组
常见的一个错误
int main()
{
int *p, i, a[10];
p = a;
for (i = 0; i < 10; i++)
{
scanf("%d", p++);
}
printf("\n");
for (i = 0; i < 10; i++, p++)
{
printf("%d", *p);
}
}
result:
1 2 3 4 5 6 7 8 9 0
-858993460-8589934602-858993460-8589934608191008-8589934602056059704819104020847438请按任意键继续. . .
实战演练
如何将一个数组a的整数按相反顺序排列
Version-1:数组名作为参数
void reverse(int x[], int n);
int main()
{
int i, a[10] = { 3,7,9,11,0,6,7,5,4,2 };//形参为数组名
printf("The original array:\n");
for (i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
reverse(a, 10);
printf("\n");
printf("The array hsa been inverted:\n");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
}
void reverse(int x[], int n)
{
int tmp, i, j,m;
m = (n - 1) / 2;
for (i = 0; i <= m; i++)
{
j = n - 1 - i;//j为i对应的元素
tmp = x[i];
x[i] = x[j];
x[j] = tmp;
//看来在函数内形参作为变量名
}
}
result:
The original array:
3 7 9 11 0 6 7 5 4 2
The array hsa been inverted:
2 4 5 7 6 0 11 9 7 3 请按任意键继续. . .
Version-2:指针作为参数
void reverse(int *x, int n);
int main()
{
int i, a[10] = { 3,7,9,11,0,6,7,5,4,2 };
printf("The original array:\n");
for (i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
reverse(a, 10);
printf("\n");
printf("The array hsa been inverted:\n");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
}
void reverse(int *x, int n)
{
int *p, tmp, *i, *j, m;
m = (n - 1) / 2;
i = x;//下标为0的第一个元素
j = n - 1 + x;//下标为n-1的最后一个元素
p = x + m;
printf("\n%d", *p);
//why p 和*p不一样????????????????
for (; i <= p;i++,j--)
{
tmp = *i;
*i = *j;
*j = tmp;
//printf("%d %d \n", *i,*j);
}
}
实战演练3
对数组中的10个整数进行从大到小的排序
void sort(int x[], int n);
int main()
{
int *p,i, a[10] = { 3,7,9,11,0,6,7,5,4,2 };
printf("The original array:\n");
for (i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
p = a;
sort(p, 10);
printf("\n");
printf("The result is :\n");
for (p=a,i = 0; i < 10; i++)
{
printf("%d ", *p);
p++;
}
printf("\n");
}
void sort(int x[], int n)
{
int i, j,tmp;
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
if (x[i] < x[j])
{
tmp = x[i];
x[i] = x[j];
x[j] = tmp;
}
}
}
}
result:
The original array:
3 7 9 11 0 6 7 5 4 2
The result is :
11 9 7 7 6 5 4 3 2 0
请按任意键继续. . .