C语言入门到进阶(指针介绍) 6th/Dec./2019

主要内容

1、什么是指针,指针的作用是什么?
2、指针的类型
3、指针的值
4、指针指向的值(区域)
5、指针的运算
6、指针和数组
7、指针和函数


1、什么是指针,指针的作用是什么?

定义:指针是一个变量,这个变量只能存地址,指针变量占据8个空间字节
作用:在函数之间传递数据(>1的多个数据)给调用者

*的用法:
1、定义的时候表明是一个指针变量
2、使用的时候,表示   取地址的值(或指针指向的区域的值)

e.g

int temp = 10;
int *p = &temp; //定义指针变量 
*p = 20; //取地址的值

&作用:取地址


2、指针的类型

1、判断指针类型的一个简单方法:去掉*和变量名,就是指针的类型
2、指针变量只能指向同种数据类型的地址

e.g

  int *p;//整型指针  
  char *p;//字符指针  
  int (*func)(int);//函数指针

3、
1、普通指针常量e.gint *pa;

2、常量指针(常量不变,指针指向的值是不能变的)

e.g

int a = 20;
int b = 30;
int const *pa = &a;//常量指针 
*pa = 50;//错误,不能改变指针指向的变量的值
 pa = &b;//正确,可以改变指针的指向

3、指针常量(数组就是指针常量的一个例子)
(指针不能变,永远指向某一个类型的数据)

int b = 30; 
int a = 20;
int * const pb = &a;
*pb = 50;//正确,可以改变指针指向的变量的值
pb = &b;//错误,不能改变指针的指向 

4、指向常量的常量指针(既不能改变指针指向的变量的值,又不能改变指针的指向)

int a = 20;
int b = 30; 
int const * const pc = &a; 
*pc = 50;//错误,不能改变指针指向的变量的值 
pc = &b;//错误 ,不能改变指针的指向 

3、指针的值

就是指向的内存空间的首地址


4、指针指向的值(区域)

一级指针:指向一个普通变量

int a = 20;
int *pa = &a;

二级指针:指向一个地址

 int a = 20;
 int *pa = &a;
 int * *pb = &pa;
 int ** *ptemp = &pb;

1、访问a的值的方法:
a = 30;
*pa = 30;
**pb = 30;
***ptemp = 30;
2、访问pb的值方法:
pc;
*ptemp;


5、指针的运算

指针是一个用数值表示的地址,可以对指针执行算术运算:++ -- - +
e.g
int num[] = {1,2,3,4,5,6,7,8,9};
*(num+1) = 20//将num[2]的值改为20
*(num++) = 20//错误 原因:数组是一个指针常量,数组的指向不能改变即等价于不能对指针名进行运算
(*num)++ = 20;//错误 原因:2 = 20;


6、指针和数组

数组名:num就是数组的首地址(打印地址 %p),数组名本身没有分配内存空间,
sizeof(num)计算整个数组的内存空间,数组是一片连续的内存空间

指针只是一个变量(存地址)

两者的共同点数组也可以用指针的方式访问
访问第一个元素
num[0] = 20;
*num = 20;
访问第二个元素
num[1] = 30;
*(num + 1) = 30;
*num + 1 = 30; //错误 1+ 1 = 30;

注:
1、在指针中,若不确定运算符优先级的情况下,加圆括号,来分清结合方式
2、数组是一个指针常量,指针的指向不能改变(即不能对数组名进行运算)


7、指针和函数

指针的作用:通过指针间接访问某个内存

定义一个函数,什么情况下参数是指针?
这个函数会不会改变传递过来的数据本身,若需要改变外部的值,就将该变量定义为指针变量

e.g改变int型变量的值

#include <stdio.h>

void test(int *pa, int *pb){
    (*pa)++;    
    (*pb)++;    
    
}//通过指针存储地址,通过指针就可以直接改变指向的变量的值,就不需要返回值 
int main(){
    int a = 20;
    int b = 30;
     
    test(&a, &b);
    printf("a:%d, b:%d",a,b);
    return 0;
}
运行结果

e.g改变数组中各个元素的值,分别加1

1、函数接收数组时,必须知道数组元素个数,函数里面是通过指针变量来接收数组的地址,指针变量无法确定指向的内容的大小
2、访问数组的两种方式
 a、num[3];
 b、*(num + 3);

#include <stdio.h>
//void test2(int p[], int count)
void test2(int *p, int count){
    for(int i = 0; i < count; i++){
        (*(p+i))++;
        //p[i]++;
    }
}

int main(){
    int num[5] = {1,2,3,4,5};
    for(int i = 0; i < 5; i++){ 
        printf("%d ",num[i]);
    }
    printf("\n");
    test2(num,5);
    for(int i = 0; i < 5; i++){ 
        printf("%d ",num[i]);
    }

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

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,423评论 3 44
  • 第十章 指针 1. 地址指针的基本概念: 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为...
    坚持到底v2阅读 1,057评论 2 3
  • C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程...
    小辰带你看世界阅读 933评论 0 6
  • 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一个字节都有一个内存...
    C语言学习阅读 1,278评论 0 4
  • 下午带老婆和淘淘出去吃饭。吃饭中途,我带淘淘到餐厅边游乐场玩耍。游乐场里面只有小朋友们,我就放他一个人放里面跟小朋...
    成不熟阅读 375评论 0 0