求职_第1篇程序设计基础及数据机构基础_第1章数组
1.1⼀维数组的声明与字符数组
1.1.1⼀维数组的声明与初始化
1.⼀维数组的声明
例1:如下定义是否正确?
int& a[10];
error C2109: 下标要求数组或指针类型
例2:定义数组a的引⽤。
int a[6] = { 0,2,4,6,8,10 };
int(*p)[6] = a;
2.⼀维数组的初始化
例1:给定如下代码:
数组x和y的值为?
int x[4] = { 0 };
int y[4] = { 1 };
x{0,0,0,0}
y{1,0,0,0}
1.1.2C风格字符串与字符数组
1.C风格字符串
例2:下列哪些是C风格字符串?
char ca1[] = { 'C','+','+' };
char ca2[] = { 'C','+','+' ,'\0' };//是
char ca3[] = "C++";//是
const char *cp = "C++";//是
char *cp1 = ca1;
char *cp2 = ca2;//是
2.字符数组
例1:下⾯的初始化是否正确?
const char ch3[6] = "Deniel";
error C2117: “ch3”: 数组界限溢出
例2:给出以下定义,则正确的叙述为数组x的长度⼤于数组y的长度。
char x[] = "abcdefg";
char y[] = { 'a','b','c','d','e','f','g' };
printf("%d\n", sizeof(x));
printf("%d\n", sizeof(y));
例3:下⾯程序段的运⾏结果是ab。
char c[5] = { 'a','b','\0','c','\0' };
printf("%s\n", c);
1.2⼆维数组
1.2.1⼆维数组的声明与初始化
例1:以下声明是否正确?
int disp(int a[][]);
error C2087: “a”: 缺少下标
例2:下列代码输出是1。
int a[3][2] = { (0,1),(2,3),(4,5) };
int *p = a[0];
printf("%d\n", p[0]);
1.2.2⾏优先存储与列优先存储
例1:有⼀矩阵⼤⼩为16Kx16K,若对两个这样的矩阵做加法运算,⾏优先读取与列优先读取的区别为⾏优先快。例2:下列程序执⾏后的输出结构是6。
#include <stdio.h>
#include <windows.h>
int main()
int a[3][3], *p, i;
p = &a[0][0];
for (i = 0; i < 9; i++)
{
p[i] = i + 1;
}
printf("%d\n", a[1][2]);
system("pause");
return 0;
}
例3:下⾯的函数是⼀个⽤指针实现⼆维数组的读取函数,请完成该函数。
#include <stdio.h>
#include <windows.h>
#define M 3
#define N 4
int get(int *p, int i, int j)
{
if (NULL == p || i < 0 || i >= M || j < 0 || j >= N)
{
return (0);
}
return *(p + i*N + j);
}
int main()
{
int a[M][N] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
printf("a[2][3] == %d\n", get(&a[0][0], 2, 3));
system("pause");
return 0;
}
例4:有⼀个⼆维数组65]有100⾏,65列,我们以⾏序为主序,如果该数组的基地址是10000,且每个元素占2个存储单元,请问a[56,22]的存储地址是?
10000+[(56-1)x65+(22-1)]x2
例5:下⾯程序执⾏的结果是:h。
#include <stdio.h>
#include <windows.h>
int main()
{
char matrix[3][3] = { {'a','b','c'},{ 'd','e','f' },{ 'g','h','i' } };
printf("%c\n", matrix[1][4]);
system("pause");
return 0;
}
1.3数组指针、指针数组与数组名的指针操作
1.3.1指针运算——算术运算、关系运算
例1:What is output if you compile and execute the following code?
Garbage value
指向常量的指针
#include <stdio.h>
#include <windows.h>
int main()
{
int i = 11;
int const *p = &i;
p++;
printf("%d\n", *p);
system("pause");
return 0;
}
1.3.2指针数组与数组指针
例1:设有“int w[3][4];”,pw是与数组名w等价的数组指针,则pw的初始化语句为int(*pw)[4] = w;。
1.3.3指针运算在数组中的应⽤
例1:下述代码是否正确?
char a[] = "hello";
a[0] = 'x';
char* q = a;
q[0] = 'b';
char* p = "hello";/*并不是把整个字符串装⼊指针变量,⽽是把存放该字符串的⾸地址装⼊指针变量*/
p[0] = 'x';
例2:针对int a[10];以下表达式不可以表⽰a[1]的地址是?
printf("0X%x\n", a + sizeof(int));
printf("0X%x\n", &a[0] + 1);
printf("0X%x\n", (int*)&a + 1);
printf("0X%x\n", (int*)((char*)&a + sizeof(int)));
0X699efcd8
0X699efccc
0X699efccc
0X699efccc
请按任意键继续. . .
例3:以下程序的运⾏结构是ga。
#include <windows.h>
int main()
{
char a[] = { "programming" }, b[] = { "language" }; char *p1, *p2;
int i;
p1 = a, p2 = b;
for (i = 0; i < 7; i++)
{
if (*(p1 + i) == *(p2 + i))
{
printf("%c", *(p1 + i));
}
}
system("pause");
return 0;
}
例4:下⾯程序执⾏的结果是编译错误。error C2106: “+=”: 左操作数必须为左值#include <stdio.h>
#include <windows.h>
int main()
{
char s[] = "abcde";
s += 2;
printf("%c\n", s[0]);
system("pause");
return 0;
}
例5:以下程序执⾏后的输出结果是4。#include <stdio.h>
#include <windows.h>
void sum(int *a)
{
a[0] = a[1];
}
int main()
{
int aa[10] = { 1,2,3,4,5,6,7,8,9,10 }, i;
指针与二维数组for (i = 2; i >= 0; i--)
{
sum(&aa[i]);
}
printf("%d\n", aa[0]);
system("pause");
return 0;
}
指针运算在⾼维数组中的应⽤

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。