1.
#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a)); //数组整体长度
printf("%d\n", sizeof(a + 0)); //首元素地址长度
printf("%d\n", sizeof(*a)); //首元素内容长度
printf("%d\n", sizeof(a + 1)); //第二个元素地址长度
printf("%d\n", sizeof(a[1])); //首元素内容长度
printf("%d\n", sizeof(&a)); //首元素地址长度
printf("%d\n", sizeof(*&a)); //数组整体长度
printf("%d\n", sizeof(&a + 1)); //数组地址整体+1后的地址长度
printf("%d\n", sizeof(&a[0])); //首元素地址长度
printf("%d\n", sizeof(&a[0] + 1)); //第二个元素地址长度
return 0;
}
2.
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr)); //数组整体长度
printf("%d\n", sizeof(arr + 0)); //首元素地址长度
printf("%d\n", sizeof(*arr)); //首元素内容长度
printf("%d\n", sizeof(arr[1])); //首元素内容长度
printf("%d\n", sizeof(&arr)); //数组地址长度
printf("%d\n", sizeof(&arr + 1)); //数组地址整体+1后的地址长度
printf("%d\n", sizeof(&arr[0] + 1)); //第二个元素地址长度
printf("%d\n", strlen(arr)); //218,随机数
printf("%d\n", strlen(arr + 0)); //218,随机数
//printf("%d\n", strlen(*arr)); //语法错误
//printf("%d\n", strlen(arr[1])); //语法错误
printf("%d\n", strlen(&arr)); //218随机数
printf("%d\n", strlen(&arr + 0)); //218,随机数
printf("%d\n", strlen(&arr + 1)); //212,随机数
printf("%d\n", strlen(&arr + 2)); //206,随机数
printf("%d\n", strlen(&arr[0] + 1)); //217,随机数
return 0;
}
3.
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //字符串长度
printf("%d\n", sizeof(arr + 0)); //首元素地址长度
printf("%d\n", sizeof(*arr + 1)); //小写a对应ASCII码97,98为整型
printf("%d\n", sizeof(arr[1])); //首字符长度
printf("%d\n", sizeof(&arr)); //字符串地址长度
printf("%d\n", sizeof(&arr + 1)); //字符串地址整体+1后的地址长度
printf("%d\n", sizeof(&arr[0] + 1)); //首字符地址长度+1后的地址长度
printf("%d\n", strlen(arr)); //字符串(无'\0')的长度
printf("%d\n", strlen(arr + 2)); //第2个元素后面字符串长度
//printf("%d\n", strlen(*arr)); //语法错误
//printf("%d\n", strlen(arr[1])); //语法错误
printf("%d\n", strlen(&arr)); //6字符穿长度
printf("%d\n", strlen(&arr + 1)); //随机数
printf("%d\n", strlen(&arr[0] + 4)); //第4个元素后面字符串长度
return 0;
}
4.
#include<stdio.h>
#include<string.h>
int main()
{
char *p = "abcdef";
printf("%d\n", sizeof(p)); //字符串指针的长度
printf("%d\n", sizeof(p + 1)); //指向字符串第二个字符的指针的长度
printf("%d\n", sizeof(*p)); //字符串首字符的长度
printf("%d\n", sizeof(p[0])); //字符串首字符的长度
printf("%d\n", sizeof(&p)); //存放指针的地址长度
printf("%d\n", sizeof(&p + 1)); //存放指针的地址+1后的长度
printf("%d\n", sizeof(&p[0] + 1)); //存放首字符的地址+1后的长度
printf("%d\n", &p); //存放指针的地址
printf("%d\n", &p[0]); //存放第一个字符的地址
printf("%d\n", &*(p + 0));
printf("%d\n", (&p[0]) + 1); //存放第二个字符的地址
printf("%d\n", strlen(p)); //字符串长度
printf("%d\n", strlen(p + 3)); //第3个元素后面字符串长度
//printf("%d\n", strlen(*p)); //语法错误
//printf("%d\n", strlen(p[0])); //语法错误
//printf("%d\n", strlen(&p)); //语法错误
//printf("%d\n", strlen(&p + 1)); //语法错误
printf("%d\n", strlen(&p[2])); //第2个元素后面字符串长度
printf("%d\n", strlen(&p[0] + 2)); //第2个元素后面字符串长度
return 0;
}
5.
#include<stdio.h>
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a)); //数组整体长度
printf("%d\n", sizeof(a[0][0])); //首元素内容长度
printf("%d\n", sizeof(a[0])); //相当于第一行数组名,即第一行数组长度
printf("%d\n", sizeof(a[0] + 1)); //相当于a[0][1],即第一行第二个元素地址长度
printf("%d\n", sizeof(*(a[0] + 1))); //第一行第二个元素内容长度
printf("%d\n", sizeof(a + 1)); //第一行数组的地址长度
printf("%d\n", sizeof(*(a + 1))); //第一行数组整体长度
printf("%d\n", sizeof(a[1])); //第一行数组整体长度
printf("%d\n", sizeof(&a[0] + 1)); //第二行数组的地址长度
printf("%d\n", sizeof(&a[0])); //第一行数组的地址长度
printf("%d\n", sizeof(*(&a[0] + 1))); //第二行数组整体长度
printf("%d\n", sizeof(*a)); //数组名表示第一行数组,即第一行数组长度
printf("%d\n", sizeof(a[3])); //第四行数组长度
return 0;
}
6.实现一个函数,可以左旋字符串中的k个字符
#include <stdio.h>
#include <string.h>
void show(char* s, int k)
{
int len = strlen(s);
char* p, *q;
for (p = s + k - 1; p >= s; --p)
{
for (q = p; q < p + len - k; ++q)
{
char tmp = *q;
*q = *(q + 1);
*(q + 1) = tmp;
}
}
}
int main()
{
char str[10];
int k = 0;
printf("输入字符串:");
scanf("%s", str);
printf("输入旋转的字符个数:");
scanf("%d", &k);
if (k > strlen(str))
{
printf("输入有误\n");
return 0;
}
show(str, k);
printf("%s\n", str);
return 0;
}
7.判断一个字符串是否为另外一个字符串旋转之后的字符串
#include<stdio.h>
#include<string.h>
int judge_fun(const char* src, const char* dest)
{
char* p = (char*)malloc(strlen(src) + strlen(src) + 1);
strcpy(p, src);
strcat(p, src);
if (strstr(p, dest) == NULL) //若是旋转后的字符串,则必包含于这个字符串
{
return 0;
}
else
return 1;
}
int main()
{
char p[] = "cdeab";
char q[] = "abcde";
int count = 0;
count = judge_fun(q, p);
printf("%d", count);
return 0;
}
总结:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。
4. 数组名+0表示数组首元素地址