数组的表达形式: 类型 数组名[常量表达式] 如:int arr[10];char brr[10];
对数组名和数组地址的测试//以下每次运行地址都是随机值,函数每次进栈都会有不同的地址,但地址关系一样
#include <stdio.h>
#include <string.h>
//数组名是数组首元素的地址 &a==a(值相同,类型不同);sizeof(a)==数组的大小,sizeof(&a)==指针的大小;
//*a==2; &a+1==数组整体加一;a+1==a[1];
int main()
{
int a[] = { 2, 3, 4, 5 }; //&a=int[4]* a=int[4]
printf("%d
", &a);//11532432 &a :数组的地址
printf("%d
",&a[3]);//11532432+4*3 &a[3] :a[3]的地址
printf("%d
", a); //11532432 a :数组首元素的地址
printf("%d
", *a);//2 *a :数组首元素
int *ptr1 = (int *)(&a + 1); &a+1 :加整个数组大小字节
printf("%d
",*a); //2
printf("%d
", *(&a)); //11532432 *(&a) : 数组首元素的地址取地址后再解引用 (?)
printf("%d
", &a); //11532432
int *ptr2 = (int *)((int)a + 1);//后移1个字节
printf("%d
",a);//11532432 a:强转后*a的值
printf("%d
", *a);//2 *a:强转后竟还可以使用(感觉不太科学,这样随意遍历数字的地址不就很危险了吗)
printf("%d
", ptr2);//11532433
int *ptr3 = (int *)(a + 1);//后移4个字节
printf("%d
", ptr3);//11532436
printf("0x%d ,0x%d ,0x%d
", ptr1[-1],ptr3[-1], *ptr2);// 0x5 ,0x2, 随机值
printf("%d
", a[4]);//数组越界产生随机值
printf("%d
",sizeof(a));//16 sizeof(a)):数组的大小
printf("%d
", sizeof(&a));//4 sizeof(&a)):指针的大小
for (int i = 0; i < 10000000; i++) //由上面想到便试了一下,结果根本不会有对应地址的值,至于为什么
{
int *b = (int*)(i + 4);
printf("%d
", *b);
}
return 0;
}
/*
int main()
{
char array[] = "hello world";
char *p = array;
printf("%d
", strlen(array));//11
printf("%d
", sizeof(array));//12
printf("%d
", strlen(p));//11
printf("%d
", sizeof(p));//4
return 0;
}
*/
数组和指针数组 数组名的含义
/*
int main()
{
int intArray[] = { 12, 4, 56, 7, 8, 90, 41 };//数组
char *strArray[] = { "hello", "world" };//指针数组
//请定义指针指向以下给定的表达式
int*p1= intArray;
int(*p2)[7]= &intArray;
char**p3= strArray;
char*(*p4)[2]= &strArray;
printf("%d
",*intArray);//12
printf("%d
", intArray[6]);//41
printf("%d
", *(intArray+0));//12
printf("%d
", intArray[0]);//12
printf("%d %d %d %d
", sizeof(intArray), sizeof(&intArray[0]), sizeof(intArray + 0), sizeof(intArray[0]));
// 4*7 4 4 4
printf("%d %d %d
", sizeof(strArray), strlen(strArray[0]), sizeof(strArray[0]));
// 4*2 5 4
return 0;
}
*/