C语言 - 数组 | 指针数组

数组

1 - 指针对应的数组元素

int ages[5]={10,9,8,7,6};
int *p = ages;// 等同于:int *p = &ages[0];
// 第 1 个元素的地址 p,&ages[0]
// 第 2 个元素的地址 p+1,&ages[1]
// 第 3 个元素的地址 p+2,&ages[2]
// ......

使用指针遍历出数组元素

int ages[5]={101,19,21,33,22};
int *p = ages;
for(int i=0;i<5;i++)
     printf("%d\t",*(p+i));

2 - 对于数组元素的 3 种访问形式

① 数组名[下标],          比如 array[2]

② 指针变量名[下标] ,   比如 p[2]

③ *(指针变量+下标),比如 *(p+2)

3 - 数组名代表数组的首元地址,但需要注意的是它是一个指针常量。指针可以当数组名使⽤,区别是两者在内存中所占字节数不一样

复制代码
char string[10] = "iphone";
char *p = string;
printf("%p \n", p);// 输出地址 0x7fff5fbff62e
    
*(p+1)='P';// 操作单个字符串
printf("%s\n",p); // 输出 iPhone
printf("%c\n",*p);// 输出是 i
printf("%c\n",*(p+2));// 输出 h

p++;// 向高位偏移
printf("%s \n",p);// 输出 Phone
printf("%c \n",*(p+1));// 输出 h
printf("%s \n",string);// 输出 iPhone
printf("%s \n",string+1);// 输出 Phone
复制代码

注:用指针来接收一个数组,其实就是使指针变量指向数组首元素

void change(int array[]);// 同 void change(int *array) 

指针 | 字符串

1 - 比较两行代码的不同

char name[] = "it";
char *name2 = "it";

name[0]='g';
printf("%s\n",name);// gt

*name2= 'y';// crash
printf("%s\n",name2);

name 是字符串变量,而 *name2 是字符串常量

C 语言的数组元素存放在栈区,里面的元素可以随便修改,称为字符串变量;而字符串常量存放于常量区,会缓存起来是不可更改的,以下简单验证

char *name1 = "it";
char *name2 = "it";
printf("%p\n%p\n",name1,name2);// 你会发现打印的地址是一样的:说明 name1 和 name2 指向的是同一个字符串

在控制台中经常使用数组来输入字符串,为什么 ?就是因为数组是可变的

char name[20];
printf("请输入姓名:\n");
scanf("%s",name);
printf("您输入的姓名是:%s\n",name);

指针数组

1 - 指针数组就是在数组中存放的都是指针

// 3 行 20 列
char melee[3][20] = {"李小龙","查克·诺里斯","增根泰三"};
char *firstFighter[3] = {"fist","foot","waist"}; // 同 char firstFighter[3][20]
firstFighter[0] = &melee[1][0];// 重新指向
printf("%s\n",*firstFighter);  // 查克·诺里斯
// 指针数组
char *arr[4]={"ios","iphone","ipod","abc"};
printf("%s \n",arr[1]);       // 输出 iphone
printf("%c \n",*(*(arr+1)+2));// 输出 h
printf("%s \n",arr[2]);       // 输出 ipod
printf("%c \n",*(arr[2]+3));  // 输出 d

注:指针变量的 +1 或 -1 究竟是加、减多少?这取决于指针类型:如果是 char 类型的指针就加 1 个字节;如果是 int 类型的指针则加 4 个字节

 

posted on   低头捡石頭  阅读(225)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示