数组与指针
此处有与最早发的指针博客有很多相同处,相同处不在过多赘述
#include <stdio.h>
void fun1(int *arr[], int n);
int main()
{
int a = 0, b = 1, c = 2, d = 3;
int *arr[4];
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
arr[3] = &d;
fun1(arr, 4);
printf("a=%d b=%d c=%d d=%d", *arr[0], *arr[1], *arr[2], *arr[3]);
return 0;
}
void fun1(int* arr[], int n)
{
for (int i = 0; i < n; i )
{
*arr[i]=*arr[i] 1;
}
}
运行结果:
a=1 b=2 c=3 d=4
指针数组
#include <stdio.h>
int main()
{ //指针数组是一个特殊的二维数组模型
//数组名既是数组首元素的地址
int a[] = { 1,2,3 };
int b[] = { 4,5,6 };
int c[] = { 7,8,9 };
int* arr[] = { a,b,c };
for (int i = 0; i < 3; i )
{
for (int j = 0; j < 3; j )
//此处arr是数组元素arr[0]的地址,但和数组a[]的首地址不是同一个地址;而是arr[0]里面存储着a[0]的首地址
//然后arr i :地址加一个偏移量(任然是地址),表示arr指针数组的第i个元素
//*(arr i)则表示将该地址中的值取出,这里表示将指针数组的第i个元素中的地址取出得到里面的“地址”!
//*(*(arr i) j)则表示将上述所说的*(arr i) j所表示地址里所存储的值取出
//综上,i表示的是a,b,c某个数组,j表示的是那个数组中的第几个元素
printf("%d ", *(*(arr i) j));
puts(" ");
}
//上述两层for循环等价于下面的两层for循环
puts("");
for (int i=0;i<3;i )
{
for (int j = 0; j < 3; j )
//此处arr[i][]
printf("%d ", arr[i][j]);
puts(" ");
}
return 0;
}
运行结果:
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
多级指针
c语言中允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。
二级指针就是指向一个指针变量地址的指针
三级指针基本用不着,但是考试会考!
二级指针:
定义一个指向指针数据的指针变量:int **p。
类比:int p=(int)(*p):表示p为一个二级指针,指向一个int型的整型指针。
假设有int型的变量a,p1是指向a的指针变量,p2又是指向p1的指针变量。
这种关系转换成c语言代码为:
int a=100; int p1=&a; int p2=&p1;
c语言不限制指针的级数,每增加一级指针,在定义指针变量的时候就得增加一个。
p1是一级指针,p2是二级指针,指向一级指针p1,定义时有两个。
#include <stdio.h>
int main()
{
int a=1;
int *p1=&a; //定义一个一级指针变量,指向a
int **p2=&p1; //定义一个二级指针变量指向一级指针p1
*p1=2; //通过一级指针改变a的值
printf("%d ",a);
**p2=3; //通过二级指针改变a的值
printf("%d",a);
return 0;
}
运行结果:
2 3
字符串去空格:
#include <stdio.h>
void remove_space(char* ch);
int main()
{
char ch[] = " h e l l ow a r l d";
remove_space(ch);
}
void remove_space(char* ch)
{
char str[100] = { 0 };
int i = 0;
int j = 0;
while (ch[i] != '\0')
{
if (ch[i] !=' ')
{
str[j] = ch[i];
j ;
}
i ;
}
printf("%s\n", str);
}
运行结果:
helloworld
指针作为函数返回值
返回一个地址
字符串中查找字符串
#include <stdio.h>
char* my_strstr(char* src, char* dest)
{
char* fsrc = src;//用于循环遍历指针
char* rsrc = src;//记录每次相同的首地址
char* tdest = dest;
while (*fsrc)
{
rsrc = fsrc;
while (*fsrc == *tdest&&*fsrc!='\0')
{
fsrc ;
tdest ;
}
if (*tdest == '\0')
{
return rsrc;
}
//回滚
fsrc = rsrc;
tdest = dest;
fsrc ;
}
return NULL;
}
int main()
{
char src[] = "hello world";
char dest[] = "llo";
char* p = my_strstr(src, dest);
printf("%s", p);
return 0;
}
运行结果:
llo world
来源:CSDN
作者:weixin_45744986
链接:https://blog.csdn.net/weixin_45744986/article/details/104075561