C 语言之函数访问

一、字符串

字符串变量访问

char i[] = "hello world!";
char *p = &s[0];
for(;*p!='\0';p++){
printf("%c",*p);
}

字符串存储在数组里,有一个特点:结尾处一定会留一个 '\0' 的字符。

结合数组的连续的内存空间和相同类型的数据特性,我们可以直接判定当前值是否为 '\0' 进行判断。

字符串函数访问

#include <stdio.h>
void test(char *p){
for(;*p!='\0';p++){
// printf("%c",*p);
putchar(*p);
}
}
int main(){
char i[] = "hello world!";
test(&i[0]);
return 0;
}

写成函数也完全一样,注意俩点:

1、我使用了 &i[0] 来传递数组的首地址。

2、printf 更换为 putchar 函数。

二、一维数组

一维数组变量访问

#include <stdio.h>
int main(){
int i[] = {1,2,3,4,5,6,7,8,9,10};
for(int number=0;number<=(sizeof(i)/sizeof(int))-1;number++){
printf("%d\n",i[number]);
}
}

用了一个小技巧:sizeof 运算。

另外有一个 -1 是因为 sizeof1 开始运算,计算机从 0 开始读取。

一维数组函数访问

#include <stdio.h>
void test(int *p,int number){
for(int i=0;i<=number-1;i++){
printf("%d\n",p[i]);
}
}
int main(){
int i[]={1,2,3,4,5,6,7,8,9,10,};
test(&i[0],sizeof(i)/sizeof(int));
return 0;
}

写成函数用到了一个技巧:void test(int *p,int number) 获取用户地址以及元素个数。

三、二维数组

二维数组变量访问(基础)

#include <stdio.h>
int main(){
char i[3][2] = {{'a','b'},{'c','d'},{'e','f'}};
char (*p)[2] = &i[0];
putchar(p[0][0]);
}

二维数组有它的特殊性,指针在访问的时候,需要将指针设置为列指针((*p) 是行;[2]是列)。

创建俩列指针,分别指向对应资源。

二维数组函数访问(函数)

#include <stdio.h>
void test(int (*sp)[2], int numberX, int numberY){
for(int x=0;x<=numberX-1;x++){
for(int y=0;y<=numberY-1;y++){
printf("%d",sp[x][y]);
}
printf("\n");
}
}
int main(){
int i[5][2]={1,2,3,4,5,6,7,8,9,10};
test(i,5,2);
return 0;
}

重点:定义了行指针,通过 传值 方式将信息给到函数处理。

二位数组函数访问(常量)

#include <stdio.h>
#define numberX 5
#define numberY 2
void test(int content[numberX][numberY]){
for(int x=0;x<=numberX-1;x++){
for(int y=0;y<=numberY-1;y++){
printf("%d",content[x][y]);
}
printf("\n");
}
}
int main(){
int i[numberX][numberY]={1,2,3,4,5,6,7,8,9,10};
test(i);
return 0;
}

重点:通过 define 预编译常量来实现二维数组的操作,更方便。

二维数组的函数访问(高级)

#include <stdio.h>
void test(int (*sp)[2], int numberY){
int *p;
p = *sp;
for(int y=0; y<numberY;y++){
printf("%d",*p++);
}
}
int main(){
int a[5][2]={1,2,3,4,5,6,7,8,9,10};
for (int i=0;i<5;i++){
test(&a[0]+i, 2);
printf("\n");
}
return 0;
}
posted @ 2021-04-26 22:49  季文康  阅读(222)  评论(0)    收藏  举报
编辑推荐:
· 记一次 ADL 导致的 C++ 代码编译错误
· MySQL查询执行顺序:一张图看懂SQL是如何工作的
· 为什么PostgreSQL不自动缓存执行计划?
· 于是转身独立开发者
· C#.Net筑基-泛型T & 协变逆变
阅读排行:
· C#/.NET/.NET Core优秀项目和框架2025年6月简报
· Cursor 1.2重磅更新,这个痛点终于被解决了!
· C#开发的Panel滚动分页控件(滑动版) - 开源研究系列文章
· 上周热点回顾(6.30-7.6)
· 记一次ADL导致的C++代码编译错误
点击右上角即可分享
微信分享提示