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;
}
运行结果
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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