您的位置:首页 > 运维架构 > Linux

嵌入式驱动开发的前期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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: