指针和一维数组
#include <stdio.h>
int main(int argc, const char *argv[])
{
int s1[5] = {
10, 20, 30, 40, 50};
s1[0] = 1314;
//数组名 就是数组的首地址
//数组名[下标] 访问成员的本质
//就是以数组首地址为基准 偏移 然后取 * 操作
printf("s1[0] = %d, *s1 = %d\n", s1[0], *s1);//1314 1314
//也就是说 数组名这个地址 的操作空间是一个元素
printf("s1[1] = %d, *(s1+1) = %d\n", s1[1], *(s1+1));//20 20
//s1[i] <==> *(s1+i)
//可以定义一个指针来保存数组的首地址
//写法如下
int *p1 = s1; //数组名 就是首地址 这种是最常用的写法
int *p2 = &s1[0];//这种写法也可以
int *p3 = &s1;//注意:这种用法 保存的地址的值是一样的
//但是&s1 相当于给指针升维了 操作空间就变了
//后面讲数组指针时再讲原因 记住 不要对数组名取地址!!!
//下面5个的 值 是一样的
printf("s1 = %p\n", s1);
printf("&s1[0] = %p\n", &s1[0]);
printf("p1 = %p\n", p1);
printf("p2 = %p\n", p2);
printf("p3 = %p\n", p3);
//指针指向数组后 就可以通过指针来操作数组的元素了
*p1 = 520;
*(p1+1) = 1314;
p1[2] = 1234;
//指针指向数组后 有如下的等价关系
// s1[i] <==> *(s1+i) <==> p1[i] <==> *(p1+i)
//一位数组的遍历
int i = 0;
for(i = 0; i < 5; i++){
//printf("%d ", s1[i]);
//printf("%d ", *(s1+i));
//printf("%d ", *(p1+i));
printf("%d ", p1[i]);
}
printf("\n");
//指针指向数组后 p1 和 s1 的区别
//p1 是指针 是变量 可以改变指向
int s2[5] = {
10, 20, 30, 40, 50};
p1 = s2;
//s1 是数组名 是地址常量 不能被赋值
//s1 = s2;//错误的
p1++;//正确的 指针的指向向后偏移 一个 int
s1++;//错误的 s1 是常量
return 0;
}
练习:
1.使用指针实现 strlen 函数的功能:
#include <stdio.h>
int main(int argc, const char *argv[])
{
char s[128] = {
0};
gets(s);
//定义一个指针 指向数组的首地址
char *p = s;
int count = 0;
#if 0
while(s[count] != '\0'){
count++;
}
#endif
#if 0
while(p[count] != '\0'){
count++;
}
#endif
#if 0