Welcome 微信登录

首页 / 操作系统 / Linux / C语言指针简单理解

 先放一个程序  指针是什么?网上主要有这么几种说法 1.指针就是一个存放地址的变量 2.指针是无符号整数a 3.指针是整型变量a 4.指针是地址 5.指针是一种类型 
1.首先 指针肯定不是 整型变量  用sizeof看 是4个字节 而且可以用%d输出。  与其说是整型变量,还不如说是无符号整数呢,但是说指针是无符号整数也存在明显的问题 下面用程序先推翻这两种说法。 #include"stdlib.h"
#include "stdafx.h"
int main()
{
    int *p1 = NULL;
    int a = 20;
    unsigned int b = 30;
    p1 = a;//error
    p1 = b;//error
    p1 *= 5;//error
    return 0;
}复制代码
把无符号整数和整数变量分别复制给指针变量, 编译器提示报错,就说明,指针不是整型变量和无符号整数。(好理解)。  而且 整数变量可以做乘法  指针变量不可以。 2.指针就是一个存放地址的变量  或者说  指针就是地址 用下面的程序测试一下     int a = 10;
    int b;
    b =&a;//报错:不能从 int* 转化为 int 这个证明了:普通变量不能存放地址  而指针变量可以存放地址(但是这个只是说明了 指针变量可以存放地址) 但是 指针不仅仅是一个存放地址的变量 而且 指针并不是地址      指针是不是只是一个地址呢?  地址一般理解为内存单位的编号,是数字。  那么 我们用这个数字是否可以操作内存单位(用地址完成指针的工作) 1 int main()
2 {
3   int a = 10;
4   int b;
5   b =(int)&a;
6   *(b) += 20;//error
7   return 0;
8 }复制代码
第5行,将a的内存地址强制转化为数字 存入b  然后用b操作a  结果呢 当然不可行  提示非法的间接寻址  看来用地址是不能完成指针的任务、 重点来了:  把这个地址变成指针如何?  1 int main()
2 {
3   int a = 10;
4   int b;
5   b =(int)&a;
6   *((int*)b) += 20;
7   printf("%d", a);
8   return 0;
9 }复制代码
运行后发现,结果正常,成功通过地址操作了变量a    上文出现的错误 大多提示的是类型转换的错误 (不能将 int *转换为int类型) 看来编译器是认为指针是一种类型  而上面的一个程序 *(b) 不正确 *((int *)b)正确 而多出来的(int *)正是指针的类型  或者说 指针由两部分组成:  数据类型和地址。。   3.事实上 指针确实不仅仅包含地址 数据类型也是非常重要的 因为 数据类型决定了指针移动的步长  比如 char类型指针++ 地址每次+1 int类型指针 地址每次+4 更复杂的还有数组 指针在二维数组中非常重要  是行+1还是列+1 操作的指针是不一样的 int main()
{
    int arr[100];
    printf("%d %d ", arr, &arr);
    printf("%d %d ", arr+1, &arr+1);
    return 0;
} 运行结果为:
9607420 9607420
9607424 9607820
请按任意键继续. . . 第一行 两个arr和&arr 都是首地址。 第二行 可以看出 arr+1 内存+4  &arr+1 内存+400 取地址的arr数据类型是整个数组 因此+1相当于+100*4 指针如果没有类型,在读取和写入也会出问题。 因为是首地址,如果没有类型,怎么知道是读取,写入几个字节呢。本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139849.htm