指针

C的精髓指针,本文基于C程序设计(谭浩强版)所写。

指针

直接访问
间接访问

指针:一个变量的地址称为该变量的“指针”。

指针变量:存放另一变量地址的变量。

指针变量的值是地址(指针)。

指针变量

类型名 *指针变量名;

类型名 是定义指针变量时必须指定的“基类型”。指针变量时基本数据类型派生出来的类型,它不能离开基本类型而独立存在。

一个变量的指针包含两个方面,一是以存储单元编号表示的地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float)。

int *a;//a是指向整型数据的指针变量
float *b;//b是指向单精度型数据的指针变量
char *c;//c是指向字符型数据的指针变量

指针类型:int */char */float *

指针变量中只能存放地址(指针),不要将证一个整数赋给一个指针变量。
比如* pointer = 100是错误的。

引用指针变量

  • 给指针变量赋值。p=&a
  • 引用指针变量指向的变量。* p
  • 引用指针变量的值。p

&/*

  • & 取地址运算符。
  • * 指针运算符。

示例:

#include <iostream>
#include <stdlib.h>
using namespace std;
<!-- 错误,交换的是形参a,b的值,即二者地址进行了交换 -->
//void swap(int *a,int *b)
//{
//    int *temp;
//    temp = a;
//    a = b;
//    b = temp;
//}
<!-- 正确,交换的是形参a,b所指向地址的值,进而改变主函数中的a,b -->
void swap(int *a,int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int a,b;
    a = 5;
    b = 3;
    swap(&a,&b);
    cout<<a<<" "<<b;
    system("pause");
    return 0;
}

通过指针引用数组

数组元素的指针就是数组元素的地址。

int a[10];
int *p;
p = &a[0];//p的值是a[0]的地址
p = a;//p的值是a首元素(即a[0])的地址。
//**数组名不代表整个数组,只代表数组首元素的地址。**

当指针指向数组元素时,p+1指向同一数组中的下一个元素p-1指向同一数组中的上一个元素。

当两个指针p1,p2指向统一数组时,p2-p1的值是地址差除以元素的长度。即二者相差的元素的个数。两地址相加是没有意义的。

通过指针引用数组元素

  • 下标法,a[i]
  • 指针法,(a+i);(p+i)

示例(混搭大法好啊_):

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    int a[10],i;
    int *p = a;
    cout<<"请输入是个整数:"<<endl;
    for (i=0;i<10;i++)
    {
        scanf("%d",p++);//不能用cin>>(p++);语法错误
    }
    p = a;
    for (i=0;i<10;i++)
    {
        printf("%d",*(p++));//cout<<*(p++)<<endl;二者均可
    }
    system("pause");
    return 0;
}

通过指针引用多维数组

以二维数组为例
int a[3][4];

表示形式 含义 地址
a 二维数组名,指向一位数组a[0],即0行首地址 2000
a[0],[a+0],a 0行0列元素地址 2000
a+1,&a[1] 1行首地址 2016
a[1],*(a+1) 1行0列元素a[1][0]的地址 2016
a[1]+2,*(a+1)+2,&a[1][2] 1行2列元素a[1][2]的地址 2024
(a[1]+2),(*(a+1)+2),a[1][2] 1行2列元素a[1][2]的值 元素值13

通过指针引用字符串

char string[] = "hello";
printf("%s\n",string);
printf("%c\n",string[4]);
printf("%c\n",*(string+4));

字符数组与字符指针变量区别

  • 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址)。
  • 可以对字符指针变量赋值,但不能对数组名赋值。正确:char *a;a="zdy";错误:char str[10];str = "zdy"
  • 初始化方式。char *a = "zdy";char str[10] = "zdy"
  • 存储单元内容。编译时为字符数组分配若干存储单元;对字符指针变量,只分配一个存储单元(VC 4个字节)。
    char *a;scanf("%s",a);//错误,将a指向键盘输入的字符串。
    char *a,str[10];a = str;scanf("%s",a);//正确。
  • 指针变量的值可以改变,但是数组名代表一个固定的值,不能改变。

指针数组

类型名 *数组名[数组长度];
int *p[4];

动态内存分配

malloc

void *malloc(unsigned int size);

函数返回分配区域的第一个字节的地址。指针的基类型为void,即不指向任何类型的数据,只提供一个地址。执行失败返回NULL。
示例:

malloc(100);

calloc(动态数组)

void *calloc(unsigned n,unsigned size);

在内存动态从存储区中分配n个长度为size的连续空间。可以为一位数组开辟动态存储空间。即动态数组。函数返回所分配域的起始地址的指针,失败返回NULL。
示例:

p = calloc(50,4);开辟50*4字节,起始地址赋给指针变量p。50个长度为4的数组。

free

void free(void *p);

释放p所指向的动态空间。p是最近一次调用calloc或malloc函数时得到的函数返回值。free函数无返回值。
示例:

free(p);

realloc

void *realloc(void *p,unsigned int size);

将p所指向的已分配的动态空间大小改为size。
示例:

realloc(p,50);//将p所指向的已分配的动态空间改为50字节。

示例:

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    void check(int *);
    int *p;
    p = (int *)malloc(5*sizeof(int));// p = malloc(5*sizeof(int));亦可
    printf("请输入五个学生的成绩:");
    for (int i = 0;i<5;i++)
    {
        scanf("%d",p+i);
    }
    check(p);
    system("pause");
    return 0;
}
void check(int *p)
{
    printf("低于60分的有:");
    for (int i = 0;i<5;i++)
    {
        if (p[i]<60)
        {
            printf("%d ",p[i]);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,423评论 3 44
  • void* 类型指针:通用变体类型指针;可以不经转换,赋给其他指针,函数指针除外;malloc返回的就是void*...
    冰吉凌阅读 3,312评论 0 18
  • C语言指针的总结 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一...
    xx_cc阅读 3,687评论 11 39
  • 1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧...
    金巴多阅读 1,722评论 0 9
  • 我在烟台边走边吃边爱,反正人山人海,反正时光大把。 上周六在学校实在是闷的慌,所以果断拉着狐朋狗友去开拓领土,说白...
    全世界早安阅读 526评论 0 2