C语言指针讲解

指针是C语言的一种数据类型,类似于C中的其他类型,例如int ,char 等。既然指针是一种类型,当我们定义该类型变量,该类型变量就称为指针变量。

C中有了指针就有了指向。指向:指针变量指向本身保存的内容(地址或指针)所表示的内存单元。

C语言指针是一个特殊的变量,其里面储存的数值被解释成为内存里的一个地址。

在计算机中,所有对数据的操作,都是通过其地址进行的,指针让程序的效率更高,代码更少。

在学习指针的时间,一定要理解并区分指针的四个感念:指针的类型,指针所指向的类型,指针的值,指针本身所占据的内存区。

指针变量定义的一般形式:类型说明符*  变量名。 类型说明符:表示该指针变量指向的变量的数据类型,并且该指针变量只能指向该数据类型的变量。这是指针变量的特征。

*:表示该变量的指针变量。这也是指针变量的特征。

变量名:表示指针变量的名称。

例如:char  *pstu;      *表示pstu是一个指针变量,char是指针变量pstu指向的变量的数据类型。整个语句表示定义了一个指向char类型变量的指针变量。但具体pstu指向哪个char类型的变量,这就要看在使用pstu时,给pstu赋予的值,值是什么就指向哪。

讲指针不得不说的两个运算符。取地址运算符&和取值运算符*。通过取地址运算符&可以获得某个变量的地址,用取值运算符可以获得某个地址中存放的数据。

指针变量使用前,先定义,给指针初始化以后,也就是赋值以后才能使用。在赋值时只能赋兼容类型的值。

例如:

#include <stdlib.h>

#include <stdio.h>

void main()

{

int name,stuName=1;

int *pStu;

int *pNew;

pStu = &stuName;

pNew = pStu;

name = *pNew;

printf("%d\n%d\n%d\n%d\n\n",stuName,*pStu,name,*pNew);

printf("%d\n%d\n%d\n%d\n\n",&stuName,&pStu,&name,&pNew);

printf("%d\n%d\n",pStu,pNew);

}

从打印的值完全可以理解内存中存放的是什么。

简单修改:

#include <stdlib.h>

#include <stdio.h>

void main()

{

int name,stuName=1;

int *pStu = NULL;

int *pNew = NULL;

pStu = &stuName;

pNew = *(&pStu);

name = *pNew;

*pStu =100;

printf("%d\n%d\n%d\n%d\n\n",stuName,*pStu,name,*pNew);

printf("%d\n%d\n%d\n%d\n\n",&stuName,&pStu,&name,&pNew);

printf("%d\n%d\n",pStu,pNew);

}

指针与整数的加法。主要用于数组中。

int arr []= {1,2,3,4,5};

int *pNew = arr;

pNew++;

pNew = pNew + 2;

数组名就是第一个数组元素的地址。 int *pNew = & arr[0];

pNew = pNew + 7; pNew的指向已经越界,具体指向不知道,可能是已存在的地址或未知地址,在使用值是会发生未知的错误。在使用指针操作时,一定要注意是否超出了数组的大小。

声明一个指针。指针变量是变量。

数组指针:和指针变量用法基本一样。

指针数组:一系列指向同一数据类型的指针变量的集合,称为指针数组。指针数组的所有元素都是指针变量。它们必须具有相同的储存类型,必须指向相同的数据类型。

类型说明符  *数组名[数组长度];

例如:int   *arr[5];

char *str[] = {"Chain","Beijing","LongMai"};

—)常量指针(指向可以修改,指向对应的值不可以修改)

常量是形容词,指针是名词,以指针为中心的一个偏正结构短语。这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针(变量)。

指针指向的对象是常量,那么这个对象不能被更改。

在C/C++中,常量指针是这样声明的:

1)const int *p;

2)int const *p;

常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值。

例如:

int a = 5,b=6;

const int *c = &a; // 这是合法的,非法的是对c的使用

c = &b;   //合法

*c = 6; // 非法,但可以这样修改c指向的对象的值:a = 6;

const int *d = &b; // b是常量,d可以指向b,d被赋值为b的地址是合法的

二) 指针常量(指向不可以修改,指向对应的值可以修改)

指针是形容词,常量是名词。这回是以常量为中心的一个偏正结构短语。那么,指针常量的本质是一个常量,而用指针修饰它,那么说明这个常量的值应该是一个指针。

指针常量的值是指针,这个值因为是常量,所以不能被赋值。

在C/C++中,指针常量这样声明:

int a;

int *const b = &a; //const放在指针声明操作符的右侧

只要const位于指针声明操作符右侧,就表明声明的对象是一个常量,且它的内容是一个指针,也就是一个地址。上面的声明可以这么读,声明了一个常量b,它的值是变量a的地址(变量a的地址,不就是指向变量a的指针吗)。

因为指针常量是一个常量,在声明的时候一定要给它赋初始值。一旦赋值,以后这个常量再也不能指向别的地址。

虽然指针常量的值不能变,可是它指向的对象是可变的,因为我们并没有限制它指向的对象是常量。

因此,有这么段程序:

char *a = "abcde1234";

char *b = "bcde";

char *const c = &a;

下面的操作是可以的。

a[0] = ‘x‘; // 我们并没有限制a为常量指针(指向常量的指针)

或者

*c[0] = ‘x‘ // 与上面的操作一致

三)指向常量的指针常量(指向不可以修改,指向对应的值也不可以修改)

顾名思议,指向常量的指针常量就是一个常量,且它指向的对象也是一个常量。

因为是一个指针常量,那么它指向的对象当然是一个指针对象,而它又指向常量,说明它指向的对象不能变化。

在C/C++中,这么声明:

const int a = 25;

const int * const b = &a;

函数指针:函数指针是指向函数的指针变量,即本质是一个指针变量

数据类型(*变量名)();

int (*f) (int x); /* 声明一个函数指针 */

 f=func; /* 将func函数的首地址赋给指针f
*/

指针函数:指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针。

以上仅仅是指针的简单介绍。有关指针的复杂用法,以后再说。。。

C语言指针讲解,布布扣,bubuko.com

时间: 2024-10-20 19:32:33

C语言指针讲解的相关文章

c/c++(疑3) C语言指针与数组之间关系

c/c++ (疑1)数组和指针 c/c++(疑2) const extern 有了前面 两篇 基础,下面我们可以更深入的来介绍c/c++(疑3) C语言指针与数组之间关系 1 概述(C语言指针与数组之间关系) 指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址.指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到. 数组就是数组,其大小与元素的类型和个数有关.定义数组时必须指定其元素的类型和个数.数组可以存任何类型的数据,但不能存函数. 2    

C语言指针

C语言指针 指针是什么? 指针也是一个变量,但是这个变量存储的是一个地址,指向一个存储单元.我们可以根据指针(地址)找到他所指的变量,并对这个变量进行操作(赋值等).通过C里面的取地址符号&和取所指内容的符号*可以很方便的表示指针以及指针所指的变量之间的关系 /* ============================================================================ Name C语言指针 : text.c Author : Version : C

C语言--指针(一)

#import <Foundation/Foundation.h> //交换函数 void swap(int x, int y) { printf("x=%d,y=%d",x,y); int temp = 0; temp = x; x = y; y = temp; printf("x=%d,y=%d",x,y); } // void swap2(int *x , int *y) { //不改地址,改地址对应的值 printf("x=%d,y=%

[转]C 语言指针的使用

第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让 我们分别说明. 先声明几个指针放着做例子: 例一: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文?lt;<如何

C语言指针的陷阱

C语言指针的陷阱   分类: C/Cpp 转自:http://blog.csdn.net/porscheyin/article/details/3461670 "C语言诡异离奇,陷阱重重,却获得了巨大成功!"--C语言之父Dennis M.Ritchie.Ritchie大师的这句话体现了C语言的灵活性以及广泛的使用,但也揭示了C是一种在应用时要时刻注意自己行为的语言.C的设计哲学还是那句话:使用C的程序员应该知道自己在干什么.有时用C写的程序会出一些莫名其妙的错误,看似根源难寻,但仔细

C语言指针占用字节

指针即为地址,存的是变量的地址,在同一架构下地址长度都是相同的(cpu的最大寻址内存空间),所以不同类型的指针长度都一样. 指针占用几个字节跟语言无关,而是跟系统的寻址能力有关,16为地址指针即为2个字节,32位系统是4个字节,64位系统为8个字节. 用sizeof求长度: #include<stdio.h> void main(void) { printf("%d %d %d\n",sizeof(int),sizeof(double),sizeof(char)); } 在

关于c语言 指针课堂随笔

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看.每当遇到圆括号时,就应该掉转阅读方向.一旦解析完圆括号里面所有的东西,就跳出圆括号.重复这个过程直到整个声明解析完毕 1.指针的判断应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个 实例: int(*func)(int*p)    先从标识符func找起往右走  碰到圆括号 反转 从左走 func的指针  再往右碰到圆括号这是个函数    func是指

c语言指针学习

前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水,食品,你能告诉还有没有问题的吗?不知大难至,世人依旧忙.祸福相依,危中有机.那些高级生命,出于慈悲,会救渡我们,但是你要去思考,去发现机缘. 最近较闲,没事就学点基础知识,整天在上层晃,感觉晕的厉害,接地气.关于指针我上学的时候学过一点,我的老师说"指针很难呢",当时以为这老师挺谦虚的.后

C语言指针,你还觉得难吗?

在研究式学习-c语言程序设计指针式这样介绍的: 内存中存储变量的第一个单元的地址 称为指针,存放指针的变量称为指针变量: 变量的访问方式有: 直接访问方式:按变量名查找其首地址 间接访问方式:通过指针访问 int swap(int p,int q){ int temp; temp=p; p=q; q=temp;} 现在理解了这个函数为什么要用指针了: 因为C语言中实参变量和形参变量之间的数据传递是单向的值传递方式,虽然运用指针被调函数不能改变实参指针变量的值,但可以改变实参指针变量指向的变量的值