初学Linux(二)---Linux下C语言中的数组与指针

初学Linux(二)—Linux下C语言中的数组与指针

在经过阶段一的linux学习之后,我来到了阶段二的Linux下的C语言编程,虽然学到目前linux下的C语言似乎跟之前学的C语言所差无几,但是按照老师的话来说,C语言指针这块尤为重要,而我在这一方面的学习也不够透彻,本文就写写C语言中数组与指针的关系与一些使用的例子。

一、数组与指针的存储原理

按照林世霖老师的说法,数组和指针的存储机制是一样的,只是存放的东西不同。所以我就按照老师的思路写。
如果按照种菜来举例,数组和指针只是种的菜不同。一个是放数据(int float…),一个放地址。下面举三个例子说明他们的存储。
例1:
int a[3] ;
挖三个坑(申请三块内存)紧挨着的,里面存放int类型的数据。
这里写图片描述
例2:
int b[2][3]; 可看成 int (b[2]) [3]
先挖两个坑,一个坑存放三个int型数据。
这里写图片描述
例3:
int *p[3] []优先级更高
所以先申请三块内存,存放地址
这里写图片描述
总结:里面放什么取决于第二部分

继续举例子
一、
Int a;
Int *p; 指针放地址 ;
把a的地址赋给p
p=&a; p等于a的地址
于是p也可以间接使用a
*p则是a的值
即 =a;
二、
int *(*q);
也是跟之前的一样 ,先申请一块内存
然后第二步,存放的东西是什么 是一个指针的地址
如果要放 int a 的地址 ,那就是错的
放int *p的地址 ,那就可以,很合适
三、
int *k[3] 等于 int (*k)[3]
*k第一部分 申请一块内存 放地址
放int a[3]的地址 k=&a;

当然,指针也可以指向函数 。
例:
int func(char a);
int (*p)(char a);
p=&func;

二、数组的一些使用

1、自适应

比如我一开始定义了 int a[] ={1,3,4,5};
我希望他全部打印出来,但是我又不清楚他有多少个。
这时候就要使用 for(i=0;isizeof(a)/sizeof(a[0];i++)
{

}
也称为自适应。

2、数组的复制

int a1 [3]={1,2,3);
int a2 [3]={4,5,6);
a1=a2; 这条语句是错误的 !
任何数组都不能直接赋值。
但是我们至少有两种方法可以赋值
一种是一个一个来 。比如a1[0]=a2[0];
第二种是使用memcpy函数
memcpy(a1,a2,sizeof(a2));这句话是将a2正块内存复制到a1

3、字符数组

char s1[10]={‘a’,’b’,’c’};
char s2[10]={“abc”};
char s3[10]=”abc”;
char s4[10]={‘a’,’b’,’c’,’\0’};
注意了,s2等于s3,s1不等于s2 ,因为s2和s3有‘\0’ ,s2等于s4 。
还有 char s5[3]=”abc”; 是越界!!

4、关于数组的地址

int a[3]

1,直接用数组取址,代表整个数组的地址,&a
2,数组名代表其首元素的地址 a ==》&a[0]
3,这张图说明了数组地址存放

数组地址原理图
4,调用函数把数组作为实参,实际上是指针的使用
传首元素的地址,这里不详细讲解。
这里写图片描述

这里写图片描述

三、扩展

1指针的大小固定为四个字节。
2数组的刚开始的地址称为基地址。
3coast的使用

第一行和第二行效果相同
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Hanghang_/article/details/55224479