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;
}