指针的入门

本文介绍了指针作为C语言核心概念的基础知识,包括指针的定义、大小、类型以及指针加减整数的概念。通过代码示例,阐述了指针如何存储地址以及如何解引用访问不同大小的数据。此外,还探讨了指针表达式的解析,并通过比较数组和指针在排序操作中的应用,突显指针的简洁性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针是·学懂c语言最关键的部分之一。首先我们先来了解一下指针到底是什么吧?

指针大小在32位平台下是4个byte,其值为某一个内存的地址。每个地址表示一个字节

什么是指针

这里我们用一段代码来说明:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>

int main()
{
    int a = 10;//定义会分配空间,声明不分配空间
    int *p = &a;//开辟4个字节,取出a的地址放到p变量中,即p指向a的地址
    printf("%p\n", p);
    system("pause");
    return 0;
}

指针的类型:type + * ;

注意:类型决定了开辟空间的大小以及如何解析该变量的内容(从栈角度)。

总的来说:指针就是地址
指针变量:用来存放地址的变量;
变量指针:即变量的地址;

指针加减整数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>


int main()
{
    int n = 10;
    char *p = (char*)&n;
    int *q = &n;

    printf("%p\n", &n);

    printf("%p\n", p);
    printf("%p\n", q);//前三个结果相同
    printf("%p\n", p + 1);//指针加1加的是其所指向元素类型的大小
    printf("%p\n", q+1);

    system("pause");
    return 0;
}

char* 的指针解引用只能访问一个字节,而int * 的指针解引用访问4个字节。

指针表达式解析

变量做左值必须有存储空间,做右值必须有内容

接下来借助一些代码了解,千万不要被绕晕喽,接招吧!

char ch = 'a';
char *cp = &ch;

判断如下哪个可做左值,哪个可做右值?


&ch;  //地址常量,可右不可左 ,ch可以做左值
cp;//变量,可左可右
&cp; //地址常量,可右不可左
*cp + 1;//常量,可右不可左
*(cp + 1); //表示cp之后的一段空间,可左可右
++cp;  //C语言变量前置++不能做左值,可做右值
cp++;//C语言变量后置++不能做左值,可做右值
*++cp; //先++再* ch的下一个空间,可左可右
*cp++; //可左可右,先解引用,再++
++*cp; // 可右不可左
(*cp)++; //可右不可左
++*++cp; //ch的下一块空间,可右不可左
++*cp++; //可右不可左

接下来写个实例来说明指针吧!

分别用数组和指针两种方式对 10个整数由大到小排序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#include <assert.h>
//分别用数组和指针进行排序
void swap(int *x, int *y)
{
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
}

void Bubble_sort(int *a, int sz)//指针
{
    assert(a);
    assert(sz > 0);
    int *end = a + sz - 1;//指向最后一个元素
    int *start =a;//指向第一个元素
    while (end > a)
    {
        int flag = 0;
        for (start = a; start < end; start++)
        {
            if (*start > *(start+1))
            {
                flag = 1;
                swap(start, start + 1);
            }
        }
        if (flag == 0)//没有交换
        {
            break;
        }

        end--;
    }
}


//void Bubble_sort(int *a, int sz)//数组
//{
//  assert(a);
//  assert(sz > 0);
//  int i = 0;
//  for (; i < sz - 1; i++)
//  {
//      int j = 0;
//      int flag = 0;//避免已经有序的数组进行冒泡
//      for (; j < sz - 1 - i; j++)
//      {
//          if (a[j]>a[j + 1])
//          {
//              flag = 1;
//              swap(&a[j], &a[j + 1]);
//          }
//      }
//      if (flag == 0)
//          return;
//  }
//}
void print(int a[], int sz)
{
    int i = 0;
    for (; i < sz; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}


int main()
{
    int a[] = { 3,1,2,43,2,1,45,12,13,6};
    int sz = sizeof(a) / sizeof(a[0]);
    print(a, sz);
    Bubble_sort(a, sz);
    print(a, sz);


    system("pause");
    return 0;
}

由此可见指针比数组代码更加简洁!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值