开发者学堂课程【你的第一门 C 语言课:指针和数组】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/444/detail/5472
指针和数组
内容介绍:
一、 指针与数组的概念及其区别
二、指针数组案例
三、 数组名的真实身份
四、 指向数组的指针
五、指向的运算
一、指针与数组的概念及其区别
指针和数据是相像的而不是相同的概念。
概念:
数组:数组是用于储存多个相同类型数据的集合。
指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。
区别:
1.赋值:
同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝
2.存储方式:
数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,多维数组在内存中是按照一维数组存储的,只是在逻辑上是多维的。
数组的存储空间,不是在静态区就是在栈上。
指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。
由于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。
二、 指针数组案例
#incLude
.
h>
int main( )
{
int a;
int *p = &a;
printf("请输入一个整数: "):
scanf ("%d",&a);
printf("a = %d\n", a) ;
printf("请重新输入一个整数: ");
scanf("%d", p);
printf("a = %d\n",a);
return 0 ;
}
#include
int main( )
{
char str[128] ;
printf("请输入鱼C的域名: ");
scanf(“%s”,str) ;
printf("鱼C工作室的域名是: %s\n",str);
return 0 ;
}
三、 数组名的真实身份
数组名其实是数组第一个元素的地址!
代码:
#include
<
stdio.h>
int main()
{
char [] = "FishC";
int b[5]={1
,
2,3,4,5};
float c[5] ={1.1,2.2,3.3,4.4,5.5};
double d[5] ={1.1,2.2,3.34.4
,
5.5};
printf("a[0]-> %p,a[1]-> %p,[2]>%p\n",&a[0],&a[1],&a[2];
printf("b[0]-> %p,b[1]-> %p,[2]>%p\n",&b[0],&b[1],&b[2];
printf("c[0]-> %p,c[1]-> %p,[2]>%p\n",&c[0],&c[1],&c[2];
printf("d[0]-> %p,d[1]-> %p,[2]>%p\n",&d[0],&d[1],&d[2];
return 0;
}
四、指向数组的指针
如果用一个指针指向数组,应该怎么做呢?
Char
*p;
p = a;
//语句1
p =&a[0];
//语句2
数组指针指向的是数组中的一个具体元素,而不是整个数组,所以数组指针的类型和数组元素的类型有关,上面的例子中,p 指向的数组元素是 int 类型,所以 p 的类型必须也是int*
五、 指针的运算
1.当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于指向距离指针所在位置向前或向后第 n 个元素。
2.对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法
3.需要郑重强调的是: p+1并不是简单地将地址加1而是指向数组的下一个元素。
代码:
#include
<
stdio.h>
int main()
{
char [] = "FishC";
int b[5]={1
,
2,3,4,5};
float c[5] ={1.1,2.2,3.3,4.4,5.5};
double d[5] ={1.1,2.2,3.34.4
,
5.5};
printf
("*b = %d, *(b+1) = %d, *(b+2) = %d\n", *b, *(b+1
),*(
b+2));
return 0;
}
#incLude
#include
int main( )
{
char *str = "I love FishC.com!";
int i;
length = strlen(str) ;
for (i = 0; i < length; 1++)
{
printf("%C", str[i]);
}
printf("\n");
return 0;
}
数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用 sizeof(p) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof(p) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。