一.有关数组名练习
//一维数组
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16
//数组首地址,大小当然是数组的大小,这里的a不仅仅是一个指针,还代表了一个数组
printf("%d\n", sizeof(a + 0));//4 数组首元素地址
printf("%d\n", sizeof(*a));//4 数组首元素a[0]
printf("%d\n", sizeof(a + 1));//4 a[1]地址
printf("%d\n", sizeof(a[1]));//4 a[1]
printf("%d\n", sizeof(&a));//4 数组首地址,这时候仅代表一个地址
printf("%d\n", sizeof(*&a));//16 数组首地址解引用,代表整个数组
printf("%d\n", sizeof(&a + 1));//4 下一个数组地址
printf("%d\n", sizeof(&a[0]));//4 首元素地址
printf("%d\n", sizeof(&a[0] + 1));//4 a[1]地址
system("pause");
return 0;
}
- 数组名可以用来替代指针,但还有更多含义;
- 将数组名赋予指针时,意为首元素地址;
- 仅当sizeof(数组名),&数组名时,为相当数组首地址;
- sizeof(&a),此时,&a仅为一个指针,所以大小为4;
- 但 &a+1 ,代表下一个数组地址;
- a[1] 相当于 *(a+1);
// 字符数组
#include <stdio.h>
#include <windows.h>
int main()
{
char arr[5] = {'a','b','c','d','e'};
printf("%d\n", sizeof(arr));//5
printf("%d\n", sizeof(arr+3));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr+1));//4
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]));//4
printf("%d\n", sizeof(&arr[0]+1));//4
//字符数组不可以用strlen()函数,因为strlen以\0为界
printf("%d\n", strlen(arr));//19
printf("%d\n", strlen(arr + 0));//19
printf("%d\n", strlen(&arr[0] + 1));//18
system("pause");
return 0;
}
//字符串数组
#include <stdio.h>
#include <windows.h>
int main()
{
char arr[] = "abcde";
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr+3));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr+1));//4
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]));//4
printf("%d\n", sizeof(&arr[0]+1));//4
printf("%d\n", strlen(arr));//5
printf("%d\n", strlen(arr + 0));//5
printf("%d\n", strlen(&arr[0] + 1));//4
system("pause");
return 0;
}
//字符串指针
#include <stdio.h>
#include <windows.h>
int main()
{
char * arr = "abcde";
printf("%d\n", sizeof(arr));//4
printf("%d\n", sizeof(arr + 3));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr + 1));//4
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr + 1));//4
//这里是指向指针的下一个内存单元(4字节),未定义。
printf("%d\n", sizeof(&arr[0]));//4
printf("%d\n", sizeof(&arr[0] + 1));//4
printf("%c\n", *(arr + 3));//d
printf("%c\n", *arr);//a
printf("%c\n", *(arr + 1));//b
printf("%d\n", strlen(arr));//5
printf("%d\n", strlen(arr + 0));//5
printf("%d\n", strlen(&arr[0] + 1));//4
system("pause");
return 0;
}
//二维数组
#include <stdio.h>
#include <windows.h>
int main()
{
int a[3][4] = { 1 ,0,0,1,0,0,0,0,0,0,0,0};
printf("%d\n", sizeof(a));//48
printf("%d\n", sizeof(a[0][0]));//4 int为4
printf("%d\n", sizeof(a[0]));//16 第一个元素的地址 是个数组名4*4
printf("%d\n", sizeof(a[0] + 1));//4 a[0][1]的地址
printf("%d\n", sizeof(*(a[0] + 1)));//4 a[0][1]的值
printf("%d\n", sizeof(a + 1));//4 第二个元素的地址,相当于a[1]
printf("%d\n", sizeof(*(a + 1)));//16 第一个元素,4个int,4*4
printf("%d\n", sizeof(&a[0] + 1));//4 a[1]的地址
printf("%d\n", sizeof(*(&a[0] + 1)));//16 第二个元素,4个int 4*4
printf("%d\n", sizeof(*a));//16 第一个元素的值
printf("%d\n", sizeof(a[3]));//16 第四个元素的地址,已经越界
system("pause");
return 0;
}
- 这里的a[0],*(a+0)为数组名,所以为16
#include <stdio.h>
#include <windows.h>
int main()
{
double a[3][4] = { 1.0,1.0,1.0,1.0,1.5,1.5,1.5,1.0 };
printf("%d\n", sizeof(a));//96
printf("%d\n", sizeof(a[0][0]));//8 double 为8
printf("%d\n", sizeof(a[0]));//32 第一个元素8*4
printf("%d\n", sizeof(a[0] + 1));//4 a[0][1]的地址
printf("%d\n", sizeof(*(a[0] + 1)));//8 a[0][1]的值
printf("%d\n", sizeof(a + 1));//4 第二个元素的地址,相当于a[1]
printf("%d\n", sizeof(*(a + 1)));//32 第一个元素
printf("%d\n", sizeof(&a[0] + 1));//4 a[1]的地址
printf("%d\n", sizeof(*(&a[0] + 1)));//32 第二个元素
printf("%d\n", sizeof(*a));//32 第一个元素
printf("%d\n", sizeof(a[3]));//32 第四个元素,已经越界
system("pause");
return 0;
}
二.指针试题
例1.
int a[5] = { 1,2,3,4,5 };
int * ptr = (int *)(&a + 1);
printf("%d %d", *(ptr + 1), *(a + 1)); // 无效数字 2
- &a+1 为下个数组地址
例2.
int a[4] = { 2,3,4,5};
int * ptr1 = (int *)(&a + 1);
char *ptr2 = (char *)((int)a +1);
printf("%x %x", ptr1[-1], *ptr2); //5 3000000
- 2 小端存储为10 00 00 00;
例3.
int a[3][2] = { {1,2},{3,4},{5,6} };
int *p = a[2];
printf("%d",p[1]); //6 p[1]相当于*(p+1)
例4.
char *a[] = { "work","at","al" ,"happy"};
char **pptr[] = {a+3,a+2,a+1,a};
char ***ppptr = pptr;
printf("%s\n", **++ppptr); //al
printf("%s\n", *--*++ppptr+3); //k
printf("%s\n", *ppptr[-2]+3);//py
printf("%s\n", ppptr[-2][-1]+1);//l
找到一篇好文章:https://blog.csdn.net/ljob2006/article/details/4872167