目录
10、下列关于二维数组输出
11、下列关输出
12、下列代码输出什么
13、下列代码输出什么
14、下列代码输出什么
15、下列代码输出什么
16、下列代码输出什么
17、下列代码输出什么
18、杨氏矩阵
19、左旋转两个字符
10、下列关于二维数组输出
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));//
printf("%d\n",sizeof(*(a[0] + 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] + 1)));//
printf("%d\n",sizeof(*a));//
printf("%d\n",sizeof(a[3]));//
return 0;
}
int main()
{
int a[3][4] = { 0 };
printf("%d\n",sizeof(a)); //48 - 3*4*4
printf("%d\n",sizeof(a[0][0]));//4 - 第一行第一列元素的大小
printf("%d\n",sizeof(a[0]));//16 - a[0]可以理解为第一行数组名,计算的是第一行的大小
printf("%d\n",sizeof(a[0] + 1));//4 - 数组名字没有单独放在sizeof内部,a[0]为首元素地址,+1就为a[0][1]
printf("%d\n",sizeof(*(a[0] + 1)));//4 - 第一个元素解引用+1,就是第一行第二个元素
printf("%d\n",sizeof(a + 1));//4/8 - a是二维数组的数组名,没有取地址也没有单独放在sizeof内部
//这里的a代表第一行的地址,+1就是第二行的地址
printf("%d\n",sizeof(*(a + 1)));//16 - a+1 表示第二行的地址,解引用就是第二行的元素 即:*(a+1) <==> a[1]
printf("%d\n",sizeof(&a[0] + 1));//4/8 - &a[0]是取第一行的地址,+1是第二行的地址
printf("%d\n",sizeof(*(&a[0] + 1)));//16 - &a[0]是取第一行的地址,+1是第二行的地址,再解引用就是第二行的大小
printf("%d\n",sizeof(*a));//16 - a没有取地址,也没有放到sizeof里面,就是首元素地址,二维数组的首元素地址是第一行
printf("%d\n",sizeof(a[3]));//16 - a[3]是第四行,虽然没有第四行,但是通过类型知道它的一行有4个字符类型的元素
return 0;
}
11、下列关输出
int main()
{
short s = 5;
int a = 4;
printf("%d\n",sizeof(s=a+6));
printf("%d\n",s); //5
return 0;
}
int main()
{
short s = 5;
int a = 4;
printf("%d\n",sizeof(s=a+6)); //2 - 其决定作用的是s,所以这里算的是s的大小
printf("%d\n",s); //5 - sizeof里的不做运算,所以这里的s还是5
return 0;
}
总结:数组名的意义
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3.除此之外所有的数组名都表示首元素的地址。
12、下列代码输出什么
int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = (int*)(&a + 1);
printf("%d,%d",*(a + 1), *(ptr - 1));
return 0;
}
int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = (int*)(&a + 1); // - &a是取真个数组a的地址,加1就是跨过整个数组即5的后面, (int*)即把它强制类型转换为int*
printf("%d,%d",*(a + 1), *(ptr - 1)); // 2 ,5 - a为首元素地址加1就是第二个元素的地址,
return 0;
}
13、下列代码输出什么
//这个结构体大小为20字节
//假设p 的值为0x100000,如下表达式的值分别是什么
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p
int main()
{
printf("%p\n",p + 0x1);
printf("%p\n",(unsigned long)p + 0x1);
printf("%p\n",(unsigned int*)p + 0x1);
return 0;
}
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p
int main()
{
printf("%p\n",p + 0x1); // 0x100014 - 结构体指针加1跨过一个结构体的大小
printf("%p\n",(unsigned long)p + 0x1); // 0x100001 - 注意这个不是指针,加1就是加1
printf("%p\n",(unsigned int*)p + 0x1); // 0x100004 - 强制转换成整形指针加1就跳过一个整形
return 0;
}
14、下列代码输出什么
int main()
{
int a[4] = {1,2,3,4};
int * ptr1 = (int*)(&a + 1);
int * ptr2 = (int*)((int)a + 1);
printf("%x %x",ptr1[-1],*ptr2);
return 0;
}
int main()
{
int a[4] = {1,2,3,4};
int * ptr1 = (int*)(&a + 1); //a是一个数组地址,加1就跳过数组的地址,即到“4”之后,强制转换成int*,所以ptr1就是指向4后面的地址
int * ptr2 = (int*)((int)a + 1); //a是一个数组地址,被强制类型转换成int,在加1就是跳一个单位(指针加1才跳过一个指针类型),又被强制类型转换成指针
printf("%x %x",ptr1[-1],*ptr2); //4 200000 按小端存储
return 0;
}
15、下列代码输出什么
int main()
{
int a[3][4] = {(0,1),(2,3),(4,5)};
int* p;
p = a[0];
printf("%d\n",p[0]);
return 0;
}
int main()
{
int a[3][4] = {(0,1),(2,3),(4,5)}; //这是一个逗号表达式,可以看作{1,3,5}
int* p;
p = a[0]; //这里如果是p = a;那么才表示第一行的地址,这里是p = a[0];表示第一行首元素的地址
printf("%d\n",p[0]); // 1
return 0;
}
16、下列代码输出什么
int main()
{
int a[5][5];
int (*p)[4];
p = a;
printf("%p,%d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]);
return 0;
}
17、下列代码输出什么
int main()
{
int aa[2][5] = {1,2,3,4,5,6,7,8,9,10};
int* ptr1 = (int*)(&aa + 1);
int* ptr2 = (int*)(*(aa + 1));
printf("%d,%d\n",*(ptr1 - 1),*(ptr2 - 1)); // 10 5
return 0;
}
18、杨氏矩阵
题目内容
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的
请编写程序在这样的矩阵中查找某个数字是否存在。
要求: 时间复杂度小于o(N) ;
//杨氏矩阵
//题目内容:
//有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的
//请编写程序在这样的矩阵中查找某个数字是否存在。
//要求: 时间复杂度小于O(N) ;
int find_num(int arr[3][3],int r, int c, int k)
{
int x = 0;
int y = c - 1;
while(x<r && y>=0)
{
if(arr[x][y] < k)
{
x++;
}
else if(arr[x][y] > k)
{
y--;
}
else
{
printf("所找的元素在第%d行 第%d列\n",x+1,y+1);
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
int k = 7;
int ret = find_num(arr,3,3,k);
if(ret == 1)
{
printf("找到了\n");
}
else
{
printf("找不到\n");
}
return 0;
}
怎么改一下不在函数里面输出,函数只返回1或0
//杨氏矩阵
//题目内容:
//有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的
//请编写程序在这样的矩阵中查找某个数字是否存在。
//要求: 时间复杂度小于O(N) ;
int find_num(int arr[3][3],int* px, int* py, int k)
{
int x = 0;
int y = *py - 1;
while(x<*px && y>=0)
{
if(arr[x][y] < k)
{
x++;
}
else if(arr[x][y] > k)
{
y--;
}
else
{
return 1;
*px = x;
*py = y;
}
}
return 0;
}
int main()
{
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
int x = 3;
int y = 3;
int k = 7;
int ret = find_num(arr,&x,&y,k);
if(ret == 1)
{
printf("找到了\n");
printf("所找的元素在第%d行 第%d列\n",x+1,y+1);
}
else
{
printf("找不到\n");
}
return 0;
}
19、左旋转两个字符
例如:abcdef ==> cdefab
#include<string.h>
void string_left_rotate(char* arr,int k)
{
int i = 0;
int len = strlen(arr);
for(i=0;i<k;i++)
{
int tmp = *arr; //每次左旋转一个字符
int j = 0; //后面的n-1个字符往前挪动
for(j=0; j<len-1;j++)
{
*(arr+j) = *(arr+j+1);
}
*(arr + len -1) = tmp;
}
}
int main()
{
char arr[10] = "abcdef";
int k = 2;
string_left_rotate(arr,k);
printf("%s\n",arr);
return 0;
}
或者
#include<string.h>
void reverse(char* left,char* right)
{
int i = 0;
while(right > left)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void string_left_rotate(char* arr,int k)
{
int n = strlen(arr);
reverse(arr,arr+k-1);
reverse(arr+k,arr+n-1);
reverse(arr,arr+n-1);
}
int main()
{
char arr[10] = "abcdef";
int k = 2;
string_left_rotate(arr,k);
printf("%s\n",arr);
return 0;
}