Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / C语言指针的相关概念

1、基础概念在 C语言里,基本变量存放的是数据,而指针变量是存放地址的变量(另一变量额地址)。在 c 语言中,指针也称之为地址,所以我们常说某某变量的指针,可以理解为某某变量的在内存中的地址。如:b 变量的指针是 1000,可以理解为  b 在内存中的地址是 1000,注意不能理解为 b 的指针变量是4004(错误的理解)。2、定义指针变量    在 c 语言指针的定义形式如下:
类型说明符 *指针变量名
    如:
int *p1,*p2; //错误的定义方式int* p1,p2;// p1 整形指针,p2 是整形变量
    在 c 里,可以在变量前加 & 符号取得变量的地址,同样地,可以在指针变量前加 * 符号取得指针变量指向的变量的值(该内存地址上存放的数据),如:
int a = 4;int *p = &a;printf("指针 p 指向的变量的值是 %d ",*p);// 注意在这行代码里, p 是指针, *p 是指向的变量的值
3、指针变量作为函数参数
//带有指针变量的函数定义形式如下void fun(int *p1,int *p2)//调用方式如下:int *ptr1 = &a1;int*ptr2 =&a2;fun(ptr1,ptr2)
    注:在被调用函数中,试图修改指针变量的值(即地址)来达到改变实参的目的都是错误的.    这句话如何理解呢?这里牵涉到一个比较容易混淆的问题-值传递和引用传递的区别.在这里提供一种理解方式,如下:将实参传给形参的时候,形参都是将实参的内容复制一遍,再调用相对应的函数.void swap1(int num1,int num2){int temp = num1;num1 = num2;num2 = temp;}void swap2(int *num1,int *num2){// 试图修改指针变量的值(地址)int *temp = num1;num1 = num2;num2 = temp;}void swap3(int *num1,int *num2){int temp = *num1;*num1 = *num2;*num2 = temp;}int main(){int a = 1,b = 2;int *ptr1 = &a,*ptr2 = &b;swap1(a,b);// 结果不变:a = 1,b = 2swap2(ptr1,ptr2);// 结果不变,a = 1,b = 2swap3(ptr1,ptr2); // a = 2, b =1}4、字符串与指针字符串是字符的集合,可以使用数组(指针常量)或指针变量来表示。
char *str1 = "tianya";char str2[] = "tianya";
   在上面代码中: str1 是一个指针变量,str2 是指针常量,所以 str2 不能使用 ++ 或 —— 运算符。输入对应字符串的值如下:
printf("str1 的值为 %s ",str1);printf("str2 的值为 %s ",str2);
     另外,我们还需要理解一下,下面这几个的定义方式的不同:
char *str = "tianya";char str[] = "tianya";char str[10] = "tianya";char str[2] = "tianya";
 C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm将C语言梳理一下,分布在以下10个章节中:
  1. Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成长之路(十):其他高级议题
5、一维数组和指针    数组与指针,是一个比较容易让人迷惑的地方,最主要就是各种不同的表示方式所代表的不同的含义,下面我们一步步来理解一下不同的方式:  1) 定义方式:
int a[5];// a 其实是一个常量指针,指向数组的第一个元素 a[0]int *p = a;// 等效于:int *p = &a[0];
    2) 通过指针引用数组元素
int a[5] = {10,20,30,40,50};int *p = a;// 或 int *p = &a[0];printf("the seconde elem is %d ",a[1]);//20printf("the seconde elem is %d ",*(a+1));//20printf("the seconde elem is %d ",p[1]);//20printf("the seconde elem is %d ",*(p+1));//20
    类似地推算,我们可以知道:a[i] 等同于 *(a+i),当中 a[0] 等同于 *a 或 *(a+0);*(p+i) 等同于 ptr[i]。看过一些书,会有着这样一种介绍 * 和 [] 等同,,结合前面的例子,我们再看另外一个例子:
int a[5] = {10,20,30,40,50};int *p = a;// 或 int *p = &a[0];printf("the seconde elem is %d ",a[1]+1);//21printf("the seconde elem is %d ",*a+1);//11,可以看成 (*a)+1 或 *(a+0)+1printf("the seconde elem is %d ",p[1]+1);//21printf("the seconde elem is %d ",*p+1);//11,可以看成 (*p)+1 或 *(p+0)+1
    是不是觉得我们基本可以了解这些使用了,我们再深入地学习一下,当 * 与 ++ 或 —— 相遇时,又会是一种什么样的情况:
// 第一种情况int a[5] = {10,20,30,40,50};int *p = a;// 或 int *p = &a[0];printf("*p++ = %d ",*p++);// 10,可以看成是 *(p++)// 第二种情况:int a[5] = {10,20,30,40,50};int *p = a;// 或 int *p = &a[0];printf("*++p = %d ",*++p);//20,可以看成 *(++p)// 第三种情况int a[5] = {10,20,30,40,50};int *p = a;// 或 int *p = &a[0];printf("++*p = %d ",++*p);// 11,可以看成 ++(*p)
    * 与 ++ 或 -- 的运算符优先级相同,结合性是由右往左。如果觉得基本都懂的,那猜猜一下下面这个例子会输出什么?
int a[5] = {10,20,30,40,50};int *p = a;// 或 int *p = &a[0];printf("*p++ = %d ",*p++);printf("*++p = %d ",*++p);printf("++*p = %d ",++*p);
    现在的我们可以来总结一下:
当 p = &a[i] 时,则有:
  • *p++ 相当于 a[i++];
  • *++p 相当于 a[++i];
  • *p--  相当于 a[i--];
  • *—p 相当于 a[—i];
 更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-09/107009p2.htm