c语言关于数组的简单运算

我们可以通过数组名+整数的运算,获取到数组每一个元素的地址

int arr[10] = { 0 };
int i = 0;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
{
    printf("&arr[%d] = %p\n", i, &arr[i]);
    printf("%p\n", arr + i);
}

数组名+i<==>第i个元素的地址

*(数组名+i)<==> 第i个元素

1.
 

    int a[] = { 1, 2, 3, 4 };
//sizeof单位是字节
    printf("%d\n", sizeof(a)); //16 ,sizeof(数组名)表示整个数组
    printf("%d\n", sizeof(a+0));//4,首元素的地址+0,还是首元素的地址
    printf("%d\n", sizeof(*a));//4,首元素‘1’,int类型
    printf("%d\n", sizeof(a+1));//4,第二个元素的地址
    printf("%d\n", sizeof(a[1]));//4,第二个元素
    printf("%d\n", sizeof(&a));//4,首元素的地址
    printf("%d\n", sizeof(&a+1));//4,跳过整个数组的下一个地址
    printf("%d\n", sizeof(&a[0]));//4,第一个元素的地址
    printf("%d\n", sizeof(&a[0]+1));//4,第二个元素的地址
    printf("%d\n", sizeof(*&a));//16,&a是整个数组的地址,解引用访问整个数组

注:

arr+1:第二个元素的地址

&arr+1:跳过整个数组的下一个地址

2. 

char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr+0));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr+1));//4
printf("%d\n", sizeof(&arr[0]+1));//4
printf("%d\n", sizeof(*&arr));//6

 

        char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
        //strlen()函数遇到‘/0’结束
	printf("%d\n", strlen(arr));//随机值
	printf("%d\n", strlen(arr+0));//随机值
	//printf("%d\n", strlen(*arr));//访问内存出错,*arr是‘a’
	//printf("%d\n", strlen(arr[1]));//访问内存出错,arr[1]是‘b’
	printf("%d\n", strlen(&arr));//随机值
	printf("%d\n", strlen(&arr+1));//随机值
	printf("%d\n", strlen(&arr[0]+1));//从b向后数,随机值

 3.

	char *p = "abcdef";
	printf("%d\n", sizeof(p));//指针,4
	printf("%d\n", sizeof(p+1));//4
	printf("%d\n", sizeof(*p));//1,a
	printf("%d\n", sizeof(p[0]));//1,a
	printf("%d\n", sizeof(&p));//4
	printf("%d\n", sizeof(&p+1));//4
	printf("%d\n", sizeof(&p[0]));//4

char *p="abcdef";

p中存放的‘a’的地址

1)先将“abcdef”放在内存里

2)在向内存申请四字节(p),用来存放地址

3)把a字符的地址放在的p中,每次用时从后向后找

所以sizeof(*p),是1,因为p里面只有a 的地址

        char *p = "abcdef";
	printf("%d\n", strlen(p));//6
	printf("%d\n", strlen(p+1));//5
	//printf("%d\n", strlen(*p));//错误,*p=‘a’
	//printf("%d\n", strlen(p[0]));//错误,p[0] = 'a'
	//printf("%d\n", strlen(&p));//随机值
	//printf("%d\n", strlen(&p+1));//随机值
	printf("%d\n", strlen(&p[0]));//6
	printf("%d\n", strlen(&p[0])+1);//随机值

4.

​	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7,整个数组
	printf("%d\n", sizeof(arr + 0));//4,首元素地址+0,还是首元素地址
	printf("%d\n", sizeof(*arr));//1,首元素地址解引用,a
	printf("%d\n", sizeof(arr[1]));//1,首元素,a
	printf("%d\n", sizeof(&arr));//4,地址
	printf("%d\n", sizeof(*&arr));//7,整个数组
	printf("%d\n", sizeof(&arr + 1));//4,地址
	printf("%d\n", sizeof(&arr[0] + 1));//4,地址值​

        char arr[] = "abcdef";
	printf("%d\n", strlen(arr));//6
	printf("%d\n", strlen(arr+0));//6
	//printf("%d\n", strlen(*arr));//错误'a'
	//printf("%d\n", strlen(arr[1]));//错误'b'
	printf("%d\n", strlen(&arr));//6
	printf("%d\n", strlen(*&arr));//6
	printf("%d\n", strlen(&arr+1));//随机值
	printf("%d\n", strlen(&arr[0]+1));//5

二维数组:


	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48
	printf("%d\n", sizeof(a[0][0]));//4
	printf("%d\n", sizeof(a[0]));//16
	printf("%d\n", sizeof(a[0]+1));//4
	printf("%d\n", sizeof(a+1));//4
	printf("%d\n", sizeof(&a[0]+1));//4
	printf("%d\n", sizeof(*a));//16
	printf("%d\n", sizeof(a[3]));//16

 

a[0]单独放在sizeof内部,表示第一行的地址,(a[0]+1)放在sizeof内部,a[0]发生降级,表示第一行第一个元素的地址,a[0]+1为第一行第二个元素的地址

猜你喜欢

转载自blog.csdn.net/audience_fzn/article/details/81368259