嵌入式驱动开发的前期Linux 和 C学习(九)
2013-08-16 08:54
316 查看
1.一维数组和指针之间的关系:Int a[10]; int *ptr=a;由于数组名是数组首元素的起始地址,所以下面四种等价:a[1]、 *(a+1)、*(ptr+1)、 ptr[1]
2.理解程序装入内存后的内存布局(总的寻址空间为4G,这些是虚拟的,操作系统会建立虚拟内存与真实内存之间的映射关系),分为那几段,每段的作用是什么?那些对应静态存储区,那些对应动态存储区。
3.掌握指针数组的基本概念。
指针数组,顾名思义就是一个数组,只是它存放的元素是指针而已,在用的时候注意点就可以了!
4.掌握二维数组:可以这样拆分,二维数组由一维数组组成,一维数组由数组元素组成。
数组指针:二维数组与数组指针之间的关系:int a[4][5];int (*ptr)[5]=a;这里ptr即时数组指针,它指向具有五个元素的一维数组(即指向二位数组的一行),以下几种等价:
a[1][2],*(*(a+1)+2),*(*(ptr+1)+2)。
注意理解a+1(同ptr+1等价)和*(a+1)(与*(ptr+1)等价)的相同点(即地址相同)和差别(地址代表意义不一样)。
5.掌握怎么在段错误的情况下产生core执行文件,要用gdb需要编译的时候加上什么选项(-g)。core文件只能发现段错误发生在什么地方。如果代码没有发生段错误,但程序执行的结果跟自己预想又不一样,就需要gdb一步步调试或者在代码中用printf进行打印。
编程例题:
1.将一个整型字符串转化为一个整型。比如”123”转化为123。要考虑到负数的情况。
int change_chars(char p[])
{
int s=0,i=0;
if(p[0]=='-')
i++;
while(p[i]!='\0')
{
s=s*10+(int)p[i]-'0';
i++;
}
if(p[0] == '-')
s = -s;
return s;
}
int main(void)
{
char a[10]="-1234";
int num;
num=change_chars(a);
printf("%d\n",num);
return 0;
}
2. 找出字符串中数字字符和字母字符的个数,用函数实现。(注意要在函数中返回这两个数)
void ret(char *p,int *num,int *letter)
{
int i=0;
for(;p[i]!='\0';i++)
{
if(p[i]>='0'&&p[i]<='9')
{
(*num)++;
}
if(p[i]>='A'&&p[i]<='Z')
{
(*letter)++;
}
if(p[i]>='a'&&p[i]<='z')
{
(*letter)++;
}
}
return ;
}
int main()
{
int num=0,letter=0;
char s[20];
printf("please input the string:");
scanf("%s",s);
ret(s,&num,&letter);
printf("num:%d letter:%d\n",num,letter);
return 0;
}
3. 写一个函数实现查找二维整型数组中最大值的行列数。注意下面两种实现的区别。
1)第一种方法:
int max(int m,int *k,int *l,int a[3][3]) //和前面等价int max(int m,int *k,int *l,int (*a)[3])
{
int max=a[0][0];
int i,j;
*k = 0;
*l=0;
for(i=0;i<m;i++)
{
for(j=0;j<3;j++)
if(max<*(*(a+i)+j))
{max=*(*(a+i)+j);
*k=i;*l=j;}
}
return max;
}
int main(void)
{
int m,i,j;
int a[3][3]={2,3,4,11,6,7,0,8,10};
m=max(3,&i,&j,a);
printf("max=%d\n所在位置是第%d行第%d列",m,i+1,j+1);
return 0;
}
2) 第二种方法:
int max(int m,int *k,int *a)
{
int max=a[0];
int i,j;
*k = 0;
for(i=0;i<m;i++)
{
if(a[i]>max)
{
max = a[i];
*k = i;
}
}
return max;
}
int main(void)
{
int m,i,j;
int a[3][3]={2,3,4,11,6,700,0,8,10};
m=max(9,&i,*a);
printf("max=%d\n所在位置是第%d行第%d列",m,i/3+1,i%3+1);
return 0;
}
2.理解程序装入内存后的内存布局(总的寻址空间为4G,这些是虚拟的,操作系统会建立虚拟内存与真实内存之间的映射关系),分为那几段,每段的作用是什么?那些对应静态存储区,那些对应动态存储区。
3.掌握指针数组的基本概念。
指针数组,顾名思义就是一个数组,只是它存放的元素是指针而已,在用的时候注意点就可以了!
4.掌握二维数组:可以这样拆分,二维数组由一维数组组成,一维数组由数组元素组成。
数组指针:二维数组与数组指针之间的关系:int a[4][5];int (*ptr)[5]=a;这里ptr即时数组指针,它指向具有五个元素的一维数组(即指向二位数组的一行),以下几种等价:
a[1][2],*(*(a+1)+2),*(*(ptr+1)+2)。
注意理解a+1(同ptr+1等价)和*(a+1)(与*(ptr+1)等价)的相同点(即地址相同)和差别(地址代表意义不一样)。
5.掌握怎么在段错误的情况下产生core执行文件,要用gdb需要编译的时候加上什么选项(-g)。core文件只能发现段错误发生在什么地方。如果代码没有发生段错误,但程序执行的结果跟自己预想又不一样,就需要gdb一步步调试或者在代码中用printf进行打印。
编程例题:
1.将一个整型字符串转化为一个整型。比如”123”转化为123。要考虑到负数的情况。
int change_chars(char p[])
{
int s=0,i=0;
if(p[0]=='-')
i++;
while(p[i]!='\0')
{
s=s*10+(int)p[i]-'0';
i++;
}
if(p[0] == '-')
s = -s;
return s;
}
int main(void)
{
char a[10]="-1234";
int num;
num=change_chars(a);
printf("%d\n",num);
return 0;
}
2. 找出字符串中数字字符和字母字符的个数,用函数实现。(注意要在函数中返回这两个数)
void ret(char *p,int *num,int *letter)
{
int i=0;
for(;p[i]!='\0';i++)
{
if(p[i]>='0'&&p[i]<='9')
{
(*num)++;
}
if(p[i]>='A'&&p[i]<='Z')
{
(*letter)++;
}
if(p[i]>='a'&&p[i]<='z')
{
(*letter)++;
}
}
return ;
}
int main()
{
int num=0,letter=0;
char s[20];
printf("please input the string:");
scanf("%s",s);
ret(s,&num,&letter);
printf("num:%d letter:%d\n",num,letter);
return 0;
}
3. 写一个函数实现查找二维整型数组中最大值的行列数。注意下面两种实现的区别。
1)第一种方法:
int max(int m,int *k,int *l,int a[3][3]) //和前面等价int max(int m,int *k,int *l,int (*a)[3])
{
int max=a[0][0];
int i,j;
*k = 0;
*l=0;
for(i=0;i<m;i++)
{
for(j=0;j<3;j++)
if(max<*(*(a+i)+j))
{max=*(*(a+i)+j);
*k=i;*l=j;}
}
return max;
}
int main(void)
{
int m,i,j;
int a[3][3]={2,3,4,11,6,7,0,8,10};
m=max(3,&i,&j,a);
printf("max=%d\n所在位置是第%d行第%d列",m,i+1,j+1);
return 0;
}
2) 第二种方法:
int max(int m,int *k,int *a)
{
int max=a[0];
int i,j;
*k = 0;
for(i=0;i<m;i++)
{
if(a[i]>max)
{
max = a[i];
*k = i;
}
}
return max;
}
int main(void)
{
int m,i,j;
int a[3][3]={2,3,4,11,6,700,0,8,10};
m=max(9,&i,*a);
printf("max=%d\n所在位置是第%d行第%d列",m,i/3+1,i%3+1);
return 0;
}
相关文章推荐
- 嵌入式驱动开发的前期Linux 和 C学习(三)
- 嵌入式驱动开发的前期Linux 和C学习(一)
- 嵌入式驱动开发的前期Linux 和 C学习(六)
- 嵌入式驱动开发的前期Linux 和C学习(二)
- 嵌入式驱动开发的前期Linux 和 C学习(五)
- 嵌入式驱动开发的前期Linux 和 C学习(四)
- 嵌入式驱动开发的前期Linux 和 C学习(七)
- 嵌入式驱动开发的前期Linux 和 C学习(十)
- 嵌入式驱动开发的前期Linux 和 C学习(八)
- 嵌入式学习-驱动开发-lesson3-混杂设备驱动模型与linux中断处理流程
- 学习嵌入式Linux驱动开发的顺序
- socket编程的最简单实例 - linux系统编程及驱动开发 - 小超嵌入式工作室 嵌入式开发学习交流论坛 XC-STC XC2440技术支持 - Powered by Discuz!
- Linux内核与驱动开发学习总结:嵌入式中南北桥(三)
- 学习嵌入式Linux系统开发基础 第五课(Linux服务器配置)
- 嵌入式Linux音频驱动开发
- 嵌入式Linux驱动开发 简要备忘
- 嵌入式设备上的LINUX系统开发与嵌入式linux的入门学习介绍
- 【嵌入式Linux学习七步曲之第四篇 Linux内核移植】详解Linux2.6内核中基于platform机制的驱动模型
- 【转】嵌入式Linux之我行——LCD背光驱动在2440上的实例开发
- 嵌入式Linux开发学习如何入门、如何深入?