本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源于课程PPT,仅用于个人学习记录
数组
实验-指针加一
#include <stdio.h>
int main()
{
int a[5] = {0};
int* p = NULL;
printf("a = 0x%X\n", (unsigned int)(a));
printf("a + 1 = 0x%X\n", (unsigned int)(a + 1));
printf("p = 0x%X\n", (unsigned int)(p));
printf("p + 1 = 0x%X\n", (unsigned int)(p + 1));
return 0;
}
/*
output:
a = 0x60FEE8
a + 1 = 0x60FEEC
p = 0x0
p + 1 = 0x4
a是数组首个元素的地址
a+1 ----> a+1*sizeof(*a) a+1*sizeof(a[0]) a+4
*/
指针运算
实验-同一数组的指针相互运算
#include <stdio.h>
int main()
{
char s1[] = {'H', 'e', 'l', 'l', 'o'};
int i = 0;
char s2[] = {'W', 'o', 'r', 'l', 'd'};
char* p0 = s1;
char* p1 = &s1[3];
char* p2 = s2;
int* p = &i;
printf("%d\n", p0 - p1);
//printf("%d\n", p0 + p2);//error: invalid operands to binary + (have 'char *' and 'char *')|
//printf("%d\n", p0 - p2);//无意义
//printf("%d\n", p0 - p);
//printf("%d\n", p0 * p2);
//printf("%d\n", p0 / p2);
return 0;
}
/*
output:
-3
*/
实验-字符串与指针
#include <stdio.h>
#define DIM(a) (sizeof(a) / sizeof(*a))
int main()
{
char s[] = {'H', 'e', 'l', 'l', 'o'};
char* pBegin = s;
char* pEnd = s + DIM(s); // Key point 指向最后一个元素的后面
char* p = NULL;
printf("pBegin = %p\n", pBegin);
printf("pEnd = %p\n", pEnd);
printf("Size: %d\n", pEnd - pBegin);
for(p=pBegin; p<pEnd; p++)
{
printf("%c", *p);
}
printf("\n");
return 0;
}
/*
output:
pBegin = 0060FEEF
pEnd = 0060FEF4
Size: 5
Hello
*/
小结
数组声明时编译器自动分配一片连续的内存空间
指针声明时只分配了用于容纳地址值的4字节空间
指针和整数可以进行运算,其结果为指针
指针之间只支持减法运算,其结果为数组元素下标差
指针之间支持比较运算,其类型必须相同