指针与数组

数组与指针
此处有与最早发的指针博客有很多相同处,相同处不在过多赘述

#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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值