首页 > 其他分享 >C语言指针

C语言指针

时间:2024-10-18 22:48:36浏览次数:9  
标签:int Value C语言 数组 Address 字符串 指针

1.程序中地址与指针实例讲解

Hi!欢迎来到指针的世界,也许您早已听过它的大名,指针被称为是C语言的精华所在。真正理解和掌握指针是征服C语言的关键所在!

在众多的计算机语言中,试问:还有哪门语言可以有C语言这样在作用、速度和安全上平衡得如此优异的呢?而指针则在其中扮演了重要的角色!或许有人会说:正是因为指针才使C程序变得非常不安全!而我则想说的是:这就要求C程序员要有更高的驾驭C语言的能力,而这点也恰好反映出C的设计哲学!那就是:“C充分相信程序员!”所以:请不要辜负它!

OK,在学习指针之前,我们先弄清楚一个概念:

地址

何谓地址?在内存(注意:我们这里提到的内存并不是人们常说的计算机的物理内存,而是虚拟的逻辑内存空间)中,简单地说:地址就是可以唯一标识某一点的一个编号,即一个数字!我们都见过尺子,我们统一以毫米为单位,一把长1000毫米的尺子,其范围区间为0~999,而我们可以准确的找到35毫米、256毫米处的位置。

同样的道理,内存也如此,也是像尺子一样线性排布,只不过这个范围略大,在我们最广泛使用的32位操作系统下,是从0~4,294,967,295之间,而地址就是这之中的的一个编号而已,习惯上,在计算机里地址我们常常用其对应的十六进制数来表示,比如0x12ff7c这样。在我们的C程序中,每一个定义的变量,在内存中都占有一个内存单元,比如int类型占四个字节,char类型占一个字节等等,每个字节都在0~4,294,967,295之间都有一个对应的编号,C语言允许在程序中使用变量的地址,并可以通过地址运算符"&"得到变量的地址。

#include<stdio.h>
int main()
{       
    int i;       
    int a[10]={1,2,3,4,5,6,7,8,9,0};       
    char b[10]={'c','l','a','n','g','u','a','g','e'};       
    for(i=0;i<10;i++)       
    {               
        printf("int Address:0x%x,Value:%d\n",&a[i],a[i]);      
    }       
    printf("\n");       
    for(i=0;i<10;i++)       
    {               
        printf("char Address:0x%x,Value :%c\n",&b[i],b[i]);       
    }       
    return 0;
}

在32位linux系统下运行参考结果:

int Address:0xbfb949c4,Value:1
int Address:0xbfb949c8,Value:2
int Address:0xbfb949cc,Value:3
int Address:0xbfb949d0,Value:4
int Address:0xbfb949d4,Value:5
int Address:0xbfb949d8,Value:6
int Address:0xbfb949dc,Value:7
int Address:0xbfb949e0,Value:8
int Address:0xbfb949e4,Value:9
int Address:0xbfb949e8,Value:0
char Address:0xbfb949f2,Value :c
char Address:0xbfb949f3,Value :l
char Address:0xbfb949f4,Value :a
char Address:0xbfb949f5,Value :n
char Address:0xbfb949f6,Value :g
char Address:0xbfb949f7,Value :u
char Address:0xbfb949f8,Value :a
char Address:0xbfb949f9,Value :g
char Address:0xbfb949fa,Value :e

 2.C语言指针的定义和使用

指针

明白地址的概念之后,指针也就不奇怪了。简单地讲,地址就是逻辑内存上的编号,而指针虽然也表示一个编号,也是一个地址。但两者性质却不相同。一个代表了常量,另一个则是变量。就好比内存是一把尺子,而指针就是尺子上面的游标,可以左右移动,它某一个时刻是指向一个地方的,这就是指针变量

类型说明符 *变量名;

其中,这里的*与前面的类型说明符共同说明这是一个指针变量,类型说明符表示该指针变量所指向的变量为何种数据类型,变量名即为定义的指针变量名。除此之外,C还提供*运算符获取地址上对应的值,例如:

#include<stdio.h>
int main()
{
        int num=2014;
        int *p=&num;
        printf("num Address = 0x%x,num=%d\n",&num,num);
        printf("p = 0x%x,*p=%d\n",p,*p);
        printf("%d\n",*&num);
        return 0;
}

请亲自运行观察结果并思考。

值得一提的是,由于指针存放的都是地址,在32位操作系统下都在0~4,294,967,295这个数区间内,所以,在32位操作系统下,任何类型的指针变量都占四个字节! 

#include<stdio.h>
struct INFO
{
        int a;
        char b;
        double c;
};
int main()
{
        int *p;
        char *p1;
        float *p2;
        double *p3;
        struct INFO *p4;   //struct INFO类型为结构体类型 我们将会在后面的章节中讲解
        void *p5;
        printf("int point size is :%d\n",sizeof(p));
        printf("char point size is :%d\n",sizeof(p1));
        printf("float point size is :%d\n",sizeof(p2));
        printf("double point size is :%d\n",sizeof(p3));
        printf("struct point size is :%d\n",sizeof(p4));
        printf("void point size is :%d\n",sizeof(p5));
        return 0;
}

3.C语言数组与指针的区别与联系 

前面我们已经知道,通过数组下标可以确定数组元素在数组中的顺序存储地址。由于每个数组元素相当于一个变量,因此指针变量可以指向数组中的元素,也就是说可以用指针方式访问数组中的元素。

对一个指向数组元素的指针变量的定义和赋值方法,与指针变量相同,例如:

int a[10]; /*定义a为包含10个整型数据的数组*/
int *p; /*定义p为指向整型变量的指针*/
p=&a[0]; /*把a[0]元素的地址赋给指针变量p*/

C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。因此:

p=a; /*等价于p=&a[0];*/
int *p=a; /*等价于int *p=&a[0];*/

对于指向首地址的指针p,p+i(或a+i)就是数组元素a[i]的地址,*(p+i)( 或*(a+i) )就是a[i]的值。

如果指针变量p已指向数组中的某一个元素,则p+1指向同一数组中的下一个元素。

引入指针变量后,就可以用以下两种方法来访问数组元素
(1)下标法,即用a[i]形式访问数组元素,在前面介绍数组时都是采用这种方法。
(2)指针法,即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,其初值p=a。

#include<stdio.h>
int main()
{
        int i;
        int a[10]={1,2,3,4,5,6,7,8,9,0};
        int *p=a;
        for(i=0;i<10;i++)
        {
                printf("P Value:%d   a Value :%d\n",*(p++),*(a+i));
        }
        printf("\n");
        return 0;
}

注意输出的两种方式,指针可以通过++或--并修改自身值的方式移动,然而数组名本身值不可以被更改。

4.C语言字符串与指针的用法

前面我们已经讨论过字符数组与字符串,字符指针也可以指向一个字符串,可以用字符串常量对字符指针进行初始化,例如:

char *str = "www.csdn.com" ;

这是对字符指针进行初始化。此时,字符指针指向一个字符串常量的首地址
还可以用字符数组来存放字符串,例如:

char string[] = "Welcome to csdn.com";

在这个语句中,string是数组名,代表字符数组的首地址。因此可以通过数组名string来访问字符串。

字符串指针和字符串数组两种方式都可以访问字符串,但它们有着本质的区别:字符指针str是个变量,可以改变str使它指向不同的字符串,但不能改变str所指向的字符串常量的值。而string是一个数组,可以改变数组中保存的内容。应注意字符串指针和字符串数组的区别。

#include<stdio.h>
int main()
{
    char *str = "www.dotcpp.com";
    char string[]="Welcome to dotcpp.com";
    str[0]='C'; //试图修改str指向的常量区的字符串内容
    return 0;
}

 5.C语言常用字符串处理函数

字符串是C语言中的重要知识,无论考试还是竞赛还是开发,字符串的使用频率都非常高,因此非常建议大家掌握字符串的基本使用方法,尤其常用的一些字符串处理函数

如 strcpy 函数,可以实现两个字符串的拷贝,strcat 函数,实现两个字符串的拼接,   strcmp 函数,可以对比两个字符串是否相等,strlen 函数,计算字符串长度等等。

以上几个是需要大家熟练掌握的,更多字符串函数见 C 语言函数库。

本章是C语言的精髓所在,需要深入理解的同时可以熟练运用指针在不同场合,当然离不开作业的练习,同学们可以把之前的数组相关的题库用指针来实现。

标签:int,Value,C语言,数组,Address,字符串,指针
From: https://blog.csdn.net/xinfanyyds/article/details/143063817

相关文章

  • 类、结构体、指针
    1、类的定义classPerson{ private: intage,height; doublemoney; stringbooks[100]; public: stringname; voidsay() { cout<<"I'm"<<name; } intget_age() { returnage; } voidadd_money(doublex) { ......
  • PTA L1系列题解(C语言)(L1_081 -- L1_088)
    L1-081今天我要赢题目内容:2018年我们曾经出过一题,是输出“2018我们要赢”。今年是2022年,你要输出的句子变成了“我要赢!就在今天!”然后以比赛当天的日期落款。输入格式:本题没有输入。输出格式:输出分2行。在第一行中输出I'mgonnawin!Today!,在第二行中用年年年......
  • 【信奥赛·C++基础语法】CSP-J C++ 指针与引用
    序言指针和引用是非常重要的概念,它们提供了对内存的直接访问和操作方式,使得程序员能够更加灵活地处理数据哈,理解指针和引用的工作原理以及正确使用它们,对于编写高效、安全的C++程序至关重要。一、指针的基本概念指针的定义和作用指针是一个变量,它存储了另一个变量的内......
  • 【C语言】⽂件操作
    ⽂件操作1.为什么使⽤⽂件?2.什么是⽂件?2.1程序⽂件2.2数据⽂件2.3⽂件名3.⼆进制⽂件和⽂本⽂件?4.⽂件的打开和关闭4.1流和标准流4.1.1流4.1.2标准流4.2⽂件指针4.3⽂件的打开和关闭5.⽂件的顺序读写5.1顺序读写函数介绍5.2对⽐⼀组函数:6.⽂件的随......
  • 83. 删除排序链表中的重复元素 线性法&快慢双指针
    83.删除排序链表中的重复元素给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:head=[1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围 [0,300] 内-100<=......
  • C++ 基础-面试题02(final和override关键字、sizeof和strlen区别、strcpy、sprintf 与me
    1.final和override关键字在C++中,final和override关键字是在面向对象编程中用于处理类的继承和多态的。它们主要用于管理派生类和虚函数,提供额外的安全性和代码可读性,防止意外的函数重写或错误的重载行为。1.final关键字final关键字用于防止进一步的继承或函数重......
  • C语言-分支循环语句 (上)
    C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。实现分支结构可以使用if、switch,实现循环结构使用for、while、dowhil......
  • C语言小白记录自己的错题和总结
    ​计算n个a的思路都是用a+a10+a100……然后在累加记得用include<math.h>pow考察逗号表达式即使像x+y x+7之类的算出结果后x和y还是不变因为没有赋值所以x和y都是原来的值问号语句先计算第一个表达式若他的值为非0(即真)将表达式2的值作为条件表达式的值反之为0即假......
  • (八千字心得笔记)零基础C语言入门第一课——初识C语言
    这一课主要是让大家初步了解C语言,了解我们的开发环境,main函数,库函数,关键字,字符和字符串等内容的介绍,后面会一一讲解文章目录一.C语言是什么1.1C语言的历史二.开发环境编译型语言和解释型语言2.1编译和链接2.2编译器的选择2.2.1VS项目和源文件、头文件介绍2.2.2......
  • 一.函数指针的创建 二.函数指针的使用
    一变量有地址,数组也有地址那么函数是否有地址呢?我们可以来试一下 我们可以看到函数有地址 之前我们知道对数组取地址是个地址,数组名拿到的也是个地址那对于函数来说呢?是不是也存在函数名和取地址函数名两个地址呢?我们可以通过代码来验证一下  那么这俩地址代表的有......