1 数组名
数组名字是数组的首元素地址,但它是一个地址常量:
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
printf("a = %p\n", a);
printf("&a[0] = %p\n", &a[0]);
//a = 10; //err, 数组名只是常量,不能修改
2 指针操作数组元素
#include <stdio.h>
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0;
int n = sizeof(a)/sizeof(a[0]);
for(i = 0; i < n; i++)
{
// printf("%d, " a[i]);
printf("%d,", *(a+i));
}
printf("\n");
int *p = a;
for(i = 0; i < n; i++)
{
p[i] = 2 * i;
}
for(i = 0; i < n; i++)
{
printf("%d", *(p+i));
}
printf("\n");
return 0;
}
tao@Taoc:~/Desktop/C/7$ ./7.3.2
1,2,3,4,5,6,7,8,9,
0246810121416
3 指针加减运算
3.1. 加法运算
- 指针计算不是简单的整数相加
- 如果是一个
int *
,+1的结果是增加一个int的大小 - 如果是一个
char *
,+1的结果是增加一个char大小
#include <stdio.h>
int main()
{
int a;
int *p = &a;
printf("%d\n", p);
p += 2; //移动了2个int
printf("%d\n", p);
char b = 0;
char *p1 = &b;
printf("%d\n", p1);
p1 += 2; // 移动了2个char
printf("%d\n",p1);
return 0;
}
通过改变指针指向操作数组元素:
#include <stdio.h>
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0;
int n = sizeof(a) / sizeof(a[0]);
int *p = a;
for (i = 0; i < n; i++)
{
printf("%d, ", *p);
p++;
}
printf("\n");
return 0;
}
3.2. 减法运算
#include <stdio.h>
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0;
int n = sizeof(a) / sizeof(a[0]);
int *p = a+n-1;
for (i = 0; i < n; i++)
{
printf("%d, ", *p);
p--;
}
printf("\n");
return 0;
}
输出结果:
tao@Taoc:~/Desktop/C/7$ ./7.3.3-2
9, 8, 7, 6, 5, 4, 3, 2, 1,
#include <stdio.h>
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int *p2 = &a[2]; //第2个元素地址
int *p1 = &a[1]; //第1个元素地址
printf("p1 = %p, p2 = %p\n", p1, p2);
int n1 = p2 - p1; //n1 = 1
int n2 = (int)p2 - (int)p1; //n2 = 4
printf("n1 = %d, n2 = %d\n", n1, n2);
return 0;
}
4 指针数组
指针数组,它是数组,数组的每个元素都是指针类型
#include <stdio.h>
int main()
{
// 指针数组
int *p[3];
int a = 1;
int b = 2;
int c = 3;
int i = 0;
p[0] = &b;
p[1] = &b;
p[2] = &c;
for(i = 0; i < sizeof(p)/sizeof(p[0]);i++)
{
printf("%d, ", *(p[i]));
}
printf("\n");
return 0;
}