一、数组名与指针
1.问题:
2.数组的访问访问方式
3.下标形式VS指针形式
4.编程实验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;//等于a[i] = i+10
}
for(i=0; i<5; i++)
{
printf("p[%d] = %d\n", i, p[i]);
}
return 0;
}
输出:
5.编程实验2:数组和指针不同
#include <stdio.h>
//验证数组名是否是指针?
int main()
{
extern int* a;//文件ext.c; 即int a[] = {1, 2, 3, 4, 5};
printf("&a = %p\n", &a); //打印指针a的地址
printf("a = %p\n", a); //打印指针a的值
printf("*a = %d\n", *a); //打印int的值
return 0;
}
//结果出现断错误
说明数组和指针是完全不同的。
二.a和&a的区别
编程实例:指针运算经典问题
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int* p1 = (int*)(&a + 1); //&a是数组的地址;&a + 1指向最后元素5后面的位置
int* p2 = (int*)((int)a + 1);
int* p3 = (int*)(a + 1); //指向第二个元素
.
printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);//p1[-1] ==>*(p1-1),指向数组最后一个元素
return 0;
}
// A. 数组下标不能是负数,程序无法运行
// B. p1[-1]将输出随机数,p2[0]输出2, p3[1]输出3
// C. p1[-1]将输出乱码, p2[0]和p3[1]输出2
输出:
扫描二维码关注公众号,回复:
4470262 查看本文章
分析:
其中,*p2的地址换算成十进制:
三.数组参数
实例分析:虚幻的数组参数
#include <stdio.h>
//说明数组参数会退化成指针
void func1(char a[5])
{
printf("In func1: sizeof(a) = %d\n", sizeof(a));
*a = 'a';
a = NULL;
}
void func2(char b[])
{
printf("In func2: sizeof(b) = %d\n", sizeof(b));
*b = 'b';
b = NULL;
}
int main()
{
char array[10] = {0};
func1(array);
printf("array[0] = %c\n", array[0]);
func2(array);
printf("array[0] = %c\n", array[0]);
return 0;
}
输出:
四、小结:
本文为听课笔记,课程出处:
https://item.taobao.com/item