学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。
实验1 :数组的访问方式
#include <stdio.h>
int main()
{
int a[5] = {0};
int* p = a;
int i = 0;
for(i=0; i<5; i++)
{
p[i] = i + 1;
}
for(i=0; i<5; i++)
{
printf("a[%d] = %d\n", i, *(a + i));
}
printf("\n");
for(i=0; i<5; i++)
{
i[a] = i + 10;
}
for(i=0; i<5; i++)
{
printf("p[%d] = %d\n", i, p[i]);
}
return 0;
}
mhr@ubuntu:~/work/C$ gcc 29-1.c
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$ ./a.out
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
p[0] = 10
p[1] = 11
p[2] = 12
p[3] = 13
p[4] = 14
mhr@ubuntu:~/work/C$
实验2 :数组与指针的不同
ext.c
int a[] = {1, 2, 3, 4, 5};
29-2.c
#include <stdio.h>
int main()
{
extern int a[];
printf("&a = %p\n", &a);
printf("a = %p\n", a);
printf("*a = %d\n", *a);
return 0;
}
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$ gcc ext.c 29-2.c
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$ ./a.out
&a = 0x601040
a = 0x601040
*a = 1
mhr@ubuntu:~/work/C$
改
#include <stdio.h>
int main()
{
extern int* a;
printf("&a = %p\n", &a);
printf("a = %p\n", a);//s 是指针 指针是变量 指针变量里面保存的是地址值,一个地址值占用4个字节(或八个字节),此时数据数据产生截断。
printf("*a = %d\n", *a);//此时a 是指针,保存着数组第一个元素的地址,即此时0x1被当做了地址,去取0x1地址中的数据,不能访问改地址。
return 0;
}
mhr@ubuntu:~/work/C$ gcc ext.c 29-2.c
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$ ./a.out
&a = 0x601040
a = 0x200000001//
Segmentation fault (core dumped)
mhr@ubuntu:~/work/C$
定义数组的时候,编译器直接将标识符a 映射到数组的首地址上面,在内存中 是没有变量名 标识符的,程序经过编译之后 所有的标识符和变量名都变成了对应的地址。
实验3 :指针运算问题
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int* p1 = (int*)(&a + 1);
int* p2 = (int*)((int)a + 1);
int* p3 = (int*)(a + 1);
printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);
return 0;
}