C语言指针的简单应用
int main()
{
int a[] = { 1,2,3,4 };//sizeof计算
printf("%d\n", sizeof(a));//sizeof(a)代表所用元素的大小,为4*4个字节
printf("%d\n", sizeof(a + 0));//a+0代表受元素的大小,为4个字节
printf("%d\n", sizeof(*a));//*a代表首元素,为4个字节
printf("%d\n", sizeof(a + 1));//a+1代表第二个元素的大小,为4个字节
printf("%d\n", sizeof(a[1]));//a[1]代表一个元素的大小,为4个字节
printf("%d\n", sizeof(&a));//&a计算的是地址的大小,32位平台为4个大小,64位平台为8个大小
printf("%d\n", sizeof(*&a));//&a为整个数组的地址,*&a为解引用之后的元素大小,为16个字节
printf("%d\n", sizeof(&a + 1));//&a+1代表地址的大小,为4或8个字节
printf("%d\n", sizeof(&a[0]));//&a[0]代表地址的大小,为4或8个字节
printf("%d\n", sizeof(&a[0] + 1));//&a[0] + 1代表地址的大小,为4或8个字节
return 0;
}
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//arr代表整个数组的大小,为1*6个字节
printf("%d\n", sizeof(arr + 0));//arr+0代表首元素地址的的大小,为4或8个字节
printf("%d\n", sizeof(*arr));//*arr代表首元素的大小,为1个字节
printf("%d\n", sizeof(arr[1]));//arr[1]代表第二个元素的大小,为一个字节
printf("%d\n", sizeof(&arr));//&arr代表地址,为4或8个字节
printf("%d\n", sizeof(&arr + 1));//&arr+1代表地址,为4或8个字节
printf("%d\n", sizeof(&arr[0] + 1));//&arr[0]+1代表地址,为4或8个字节
printf("%d\n", strlen(arr));//strlen为计算字符串长度的,以'\0'为结束标志,arr数组中没有'\0',无法计算大小
printf("%d\n", strlen(arr + 0));//strlen为计算字符串长度的,以'\0'为结束标志,arr数组中没有'\0',无法计算大小
printf("%d\n", strlen(*arr)); //strlen为计算字符串长度的,以'\0'为结束标志,arr数组中没有'\0',无法计算大小
printf("%d\n", strlen(arr[1]));//strlen为计算字符串长度的,以'\0'为结束标志,arr数组中没有'\0',无法计算大小
printf("%d\n", strlen(&arr));//strlen为计算字符串长度的,不能计算地址的大小
printf("%d\n", strlen(&arr +1));//strlen为计算字符串长度的,不能计算地址的大小
printf("%d\n", strlen(&arr[0]+ 1));//strlen为计算字符串长度的,不能计算地址的大小
return 0;
}
int main()
{
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//arr数组中有6个元素加一个结尾的'\0',一共有7个元素,为sizeof(arr)的大小为7个字节
printf("%d\n", sizeof(arr + 0));//arr+0代表首元素地址的的大小,为4或8个字节
printf("%d\n", sizeof(*arr));//*a为数组arr的首元素的大小,为1个字节
printf("%d\n", sizeof(arr[1]));//arr[1]为第二个元素的大小,为1个字节
printf("%d\n", sizeof(&arr));//&arr代表地址,为4或8个字节
printf("%d\n", sizeof(&arr + 1));//&arr+1代表地址,为4或8个字节
printf("%d\n", sizeof(&arr[0] + 1));//&arr[0]+1代表地址,为4或8个字节
printf("%d\n", strlen(arr));//arr后有'\0',所以strlen(arr)的长度为6
printf("%d\n", strlen(arr + 0));//strlen(arr+0)是从第一个元素开始的,所以长度为6
printf("%d\n", strlen(*arr));//*arr代表首元素,无法计算
printf("%d\n", strlen(arr[1]));//arr[1]为首元素,无法计算
printf("%d\n",strlen(&arr));;//strlen是计算字符串长度的,不能计算地址的大小
printf("%d\n", strlen(&arr +1));//strlen是计算字符串长度的,不能计算地址的大小
printf("%d\n", strlen(&arr[0]+ 1));//strlen是计算字符串长度的,不能计算地址的大小
return 0;
}
int main()
{
char* p = "abcdef";
printf("%d\n", sizeof(p));//p的类型为char*,为指针数组,所以p为地址,为4或8个字节
printf("%d\n", sizeof(p + 1));//p的类型为char*,为指针数组,所以p为地址,为4或8个字节
printf("%d\n", sizeof(*p));//*p代表首元素的大小,为一个字节
printf("%d\n", sizeof(p[0]));//p[0]也代表首元素的大小,为一个字节
printf("%d\n", sizeof(&p));//&p代表地址,为4或8个字节
printf("%d\n", sizeof(&p + 1)); //&p+1代表地址,为4或8个字节
printf("%d\n", sizeof(&p[0] + 1));//&p[0] + 1代表地址,为4或8个字节
printf("%d\n", strlen(p));//p为char*类型的指针,代表p中的元素个数,为6个
printf("%d\n", strlen(p + 1));//p+1代表第二个元素的指针,所以为5
printf("%d\n", strlen(*p));//*p为地址,无法计算
printf("%d\n", strlen(p[0]));//p[0]为地址,无法计算
printf("%d\n", strlen(&p));//&p为地址,无法计算
printf("%d\n", strlen(&p +1));//&p + 1为地址,无法计算
printf("%d\n", strlen(&p[0] +1));//&p[0] + 1为地址,无法计算
return 0;
}
总结:
数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。