关于指针的总结

关于指针的总结:

      1.指针含义:

      {

               指针其实是一个用于存放内存地址的变量.在内存中跟整形没什么区别,由于他必须保存的数据必须能够唯一标示一个内存单元.所以在32位系统里面只占用两个字节的长度.但是为什么在声明一个指针变量的的时候却要指定是指向哪一种类型的指针呢(eg: int * pInt;  float * pFloat;) ?  个人认为是为了方便指针的操作,

               因为pInt ++ ;会使 指针 的 指向移动 sizeof(int)  字节大小(32位机器为两个字节).而 pFloat ++; 却会使指针移动 sizeof(float) 字节大小?,

      }

       2.指针声明:

            指向基本类型的指针: int * 变量名;.....

            指向结构体的指针: struct  myStruct * 变量名;

                  struct myStruct 

                  {

                        int a;

                        int b; 

                   };

                 声明:  struct  myStruct * Var;

            指向函数的指针:

1 
2 typedef  int  (*FunctionName)(variableType varA,variableType varB); /*详见 上一篇 随笔 "简单链表练习"*/

      这样的话 FunctionName 就成了一种类型;即为: 指向一个返回值 为int ,参数为两个variableType 的函数 的指针 了;

      如此一来,我们 便可以想用 基本类型一样 声明一个 FunctionName 成员了.

      只是调用 有点不同. eg: FunctionName fn;

              fn = F; /*或者 fn = &F;  F为一个符合FunctionName 的 函数*/ 

              fn(varA,varB); /*执行函数 F();*/

              3.指针操作:    

       指针可以像其他变量一样进行基本运算,甚至可以直接将一个数字赋给指针变量(类型转换);但是时刻谨记他表示的是一个地址;稍有偏差便会导致程序出错.

            4.一些细节和补充:

                  指针与const限定符: (此处不介绍函数类型. 函数类型只是 函数声明的一种 简便方式.)

                  const限定符和指针结合起来常见的情况有以下几种。

const int *a;
int const *a;

这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。

int * const a;

a是一个指向int型的const指针,*a是可以改写的,但a不允许改写。

int const * const a;

a是一个指向const int型的const指针,因此*aa都不允许改写。

指向非const变量的指针或者非const变量的地址可以传给指向const变量的指针,编译器可以做隐式类型转换,例如:

char c = 'a';
const char *pc = &c;

但是,指向const变量的指针或者const变量的地址不可以传给指向非const变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告:

const char c = 'a';
char *pc = &c;

即使不用const限定符也能写出功能正确的程序,但良好的编程习惯应该尽可能多地使用const,因为:

  1. const给读代码的人传达非常有用的信息。比如一个函数的参数是const char *,你在调用这个函数时就可以放心地传给它char *const char *指针,而不必担心指针所指的内存单元被改写。

  2. 尽可能多地使用const限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。

  3. const对编译器优化是一个有用的提示,编译器也许会把const变量优化成常量。

      字符串字面值通常分配在.rodata段,而字符串字面值类似于数组名,做右值使用时自动转换成指向首元素的指针,这种指针应该是const char *型。我们知道printf函数原型的第一个参数是const char *型,可以把char *const char *指针传给它,所以下面这些调用都是合法的:

const char *p = "abcd";
const char str1[5] = "abcd";
char str2[5] = "abcd";
printf(p);
printf(str1);
printf(str2);
printf("abcd");

注意上面第一行,如果要定义一个指针指向字符串字面值,这个指针应该是const char *型,如果写成char *p = "abcd";就不好了,有隐患,例如:

int main(void)
{
char *p = "abcd";
...
*p = 'A';
...
}

p指向.rodata段,不允许改写,但编译器不会报错,在运行时会出现段错误。

原文地址:https://www.cnblogs.com/ToDoToTry/p/1519945.html