C语言中指针的用法介绍(2)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中指针的用法介绍(2)相关的知识,希望对你有一定的参考价值。

参考技术A   如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘 sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。

  总结一下,一个指针ptrold加上一个整数 n后,结果是一个新的指针ptrnew,

  ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了 n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了 n乘 sizeof(ptrold所指向的类型)个字节。

  一个指针ptrold减去一个整数 n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了 n乘 sizeof(ptrold所指向的类型)个字节,就是说, ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

  第三章。运算?amp;和*

  这里&是取地址运算符,*是...书上叫做"间接运算符"。

  &a的运算结果是一个指针,指针的类型是 a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a 的地址。*p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。

  例五:

  int a=12;

  int b;

  int *p;

  int **ptr;

  Generated by Foxit PDF Creator ? Foxit Software

  http://www.foxitsoftware.com For evaluation only.p=&a;//&a的结果是一个指针,类型是 int*,指向的类型是 int,指向的地址是a的地址。*p=24;//*p的结果,在这里它的类型是 int,它所占用的地址是p所指向的地址,显然,*p就是变量a。ptr=&p;//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是 int**。该指针所指向的类型是p的类型,这里是 int*。该指针所指向的地址就是指针p自己的地址。

  *ptr=&b;//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b来给*ptr赋值就是毫无问题的了。**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指

  针再做一次*运算,结果就是一个 int 类型的变量。

  第四章。指针表达式。

  一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。

  下面是一些指针表达式的例子:

  例六:

  int a,b;

  int array[10];

  int *pa;

  pa=&a;//&a是一个指针表达式。

  int **ptr=&pa;//&pa也是一个指针表达式。

  *ptr=&b;//*ptr和&b都是指针表达式。

  pa=array;

  pa++;//这也是指针表达式。

  例七:

  char *arr[20];

  char **parr=arr;//如果把arr 看作指针的话,arr 也是指针表达式

  char *str;

  str=*parr;//*parr 是指针表达式

  str=*(parr+1);//*(parr+1)是指针表达式

  str=*(parr+2);//*(parr+2)是指针表达式

  由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

  好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。

  在例七中,&a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr 这个指针已经占据了内存,其实*ptr 就是指针 pa,既然 pa 已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。

  第五章。数组和指针的关系

  Generated by Foxit PDF Creator ? Foxit Software

  http://www.foxitsoftware.com For evaluation only.如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文?lt;<如何理解c 和c++的复杂类型声明>>。数组的数组名其实可以看作一个指针。看下例:

  例八:

  int array[10]=0,1,2,3,4,5,6,7,8,9,value;

  ...

  ...

  value=array[0];//也可写成:value=*array;

  value=array[3];//也可写成:value=*(array+3);

  value=array[4];//也可写成:value=*(array+4);

  上例中,一般而言数组名array代表数组本身,类型是 int [10],但如果把array看做指针的话,它指向数组的第 0个单元,类型是 int *,所指向的类型是数组单元的类型即 int。因此*array等于 0 就一点也不奇怪了。同理,array+3 是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

  例九:

  例九:

  char *str[3]=

  "Hello,this is a sample!",

  "Hi,good morning.",

  "Hello world"

  ;

  char s[80];

  strcpy(s,str[0]);//也可写成strcpy(s,*str);

  strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));

  strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));

  上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名 str 当作一个指针的话,它指向数组的第 0号单元,它的类型是char**,它指向的类型是char *。
  *str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即’H’的地址。

C 语言const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )





一、const 普通用法



const 关键字 在 C 和 C++ 中的表现不同 , 本篇博客主要介绍 C 语言中的 const 用法 ;


const 的用法 : 下面的 2 2 2 个写法作用相同 , const 可以在 数据类型 前面 , 也可以在 数据类型 后面 ;

// 下面两个 const 用法相同
const int a;
int const a;




二、常量指针 ( 指向 常量 的指针 | 被指向的内存不能被修改 )



下面的 c 是 指向 常量字符 的指针 , const char 表示 常量字符 , const char * 表示 指向 常量字符 的指针 ;

  • 该指针 指向的 内存空间 不能被修改 ,
  • 指针可以被修改 ;
// 指向 常量字符 的指针 
const char *c;

上述代码 指针指向的 内存 是常量 ; 常量指针





三、指针常量 ( 指针不能被修改 )



下面的 d 是 指向 字符 的 常量指针 , char * 表示一个指向 char 字符的指针 , 后面加上 const 表示该指针 是 常量指针 ;

  • 该指针 指向的 内存空间 可以被修改 ,
  • 指针 不能 被修改 ;
char * const d;

上述代码 指针 是常量 ; 指针常量





三、指向 常量 的 指针常量



下面的 c 是 常量指针 指向一个常量 , 指针 和 指针指向的内存 , 都不能被修改 ;

const char * const c; 




四、const 在 * 左右的意义



普通的数据类型 , const 在数据类型左右作用相同 ;


指针数据类型 , const 在 * 左侧是 常量指针 ( 内存不能修改 ) , const 在 * 右侧是 指针常量 ( 指针不能被修改 ) ;

指针常量与常量指针 : 需要查看 const 修饰的是 指针变量 , 还是 修饰 指针变量 指向的内存空间 ;

  • const 在 * 右边 ( 指针常量 | const 修饰的是变量 ) : const 修饰的是 指针变量 , 如 char * const d , const 修饰的是 char * , 指针不能被修改 ; 这是 指针常量 ;
  • const 在 * 左边 ( 常量指针 | const 修饰的是数据类型 ) : const 修饰的是 指针变量 指向的内存空间 , 如 const char *c , const 修饰的是 char , char 数据不能被修改 , 这是 常量指针 , 指向常量的指针 ;

const 修饰的是右边的内容 ,

  • 右边是 变量 , 相当于 const 在 * 右边 , 指针常量 , 指针不能修改 ;
  • 右边是 数据类型 , 相当于 const 修饰的是 内存中的数据 , 指针指向的内存不能被修改 ;

以上是关于C语言中指针的用法介绍(2)的主要内容,如果未能解决你的问题,请参考以下文章

c语言sleep的用法

C语言指针用法详解 指针

C语言中new的用法

C/C++语言指针用法详解 指针和数组

C 语言const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )

c语言 指针问题