初阶C语言——指针(下)

简介: 初阶C语言——指针(下)
  1. 指针使用之前检查有效性
#include <stdio.h>
int main()
{
    int *p = NULL;
    //....
    int a = 10;
    p = &a;
    if(p != NULL)
   {
        *p = 20;
   }
    return 0;
}

4.1 指针±整数

#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
     *vp++ = 0;
}

将浮点型vp地址中的内容变成0,变五个地址

因为vp是一个float类型的·指针,所以对float类型的指针进行±.移动的是float个单位

4.2 指针-指针

我们之前用过strlen函数来求字符串长度,现在我们也可以用指针来求字符串长度

#include<stdio.h>
#include<string.h>
int main()
{
  char str[] = "abcdef";
  int len = strlen(str);
  printf("%d ", len);
  return 0;
}

这是我们用strlen函数求出的字符串长度,现在我们用指针来求,定义一个函数my_strlen来求字符串长度

#include<stdio.h>
int my_strlen(char* str)
{
  int count = 0;
  while (*str != '\0')
  {
    count++;
    str++;
  }
  return count;
}
int main()
{
  char str[] = "abcdef";
  int len = my_strlen(str);
  printf("%d", len);
  return 0;
}

当然我们之前也用过函数递归的思路来写代码,这里再带大家回忆一下

#include<stdio.h>
int my_strlen(char* str)
{
  if (*str != '\0')
  {
    return 1 + my_strlen(str+1);
  }
}
int main()
{
  char str[] = "abcdef";
  int len = my_strlen(str);
  printf("%d", len);
  return 0;
}

我们现在至少掌握三种求字符串长度的求法

4.3 指针的关系运算

for(vp = &values[N_VALUES]; vp > &values[0];)
{
    *--vp = 0;
}
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
    *vp = 0

实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。

标准:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

5. 指针和数组

我们先来看一下下面这串代码

#include <stdio.h>
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);
    return 0;
}

可以看到他们的地址内容是相同的,而且我们再前面的学习中一直强调数组名是首元素地址,除了两个特例外(sizeof)(&),其他任何情况数组名就是首元素地址

既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。

#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
  int* p = arr;//存放首元素地址
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p + i);
  }
  return 0;
}

所以可以用指针来访问数组地址

所以 p+i 其实计算的是数组 arr 下标为i的地址。

6. 二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?

*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .

int b = 20;

*ppa = &b;//等价于 pa = &b;

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a

**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

7. 指针数组

指针数组是指针还是数组?

答案:是数组。是存放指针的数组。

数组我们已经知道整形数组,字符数组。

上面应该是int arr[4]

那么我们的指针数组是啥样的呢

指针也讲完了,后期还会更深入地了解指针,因为指针真的很重要,你会C语言必须得会指针,今天我们地分享就到这里了,谢谢大家得支持,你们的支持就是我的动力,拜拜



相关文章
|
1天前
|
安全 C语言
【C语言】如何规避野指针
【C语言】如何规避野指针
21 0
|
1天前
|
C语言
c语言指针总结
c语言指针总结
15 1
|
1天前
|
C语言
C语言(指针详解)重点笔记:指针易错点,都是精华
C语言(指针详解)重点笔记:指针易错点,都是精华
5 0
|
1天前
|
存储 C语言
C语言指针讲解(适用于初学者)
C语言指针讲解(适用于初学者)
6 0
|
1天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
1天前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
11 2
|
1天前
|
存储 编译器 C语言
【C语言】初步解决指针疑惑
【C语言】初步解决指针疑惑
7 0
|
1天前
|
存储 C语言
指针深入解析(C语言基础)带你走进指针,了解指针
指针深入解析(C语言基础)带你走进指针,了解指针
|
1天前
|
C语言 C++
C语言:指针运算笔试题解析(包括令人费解的指针题目)
C语言:指针运算笔试题解析(包括令人费解的指针题目)
|
1天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)