C语言指针的相关概念

在 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 \r\n",*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 = 2 swap2(ptr1,ptr2); // 结果不变,a = 1,b = 2 swap3(ptr1,ptr2); // a = 2, b =1 } 4、字符串与指针 字符串是字符的集合,可以使用数组(指针常量)或指针变量来表示。 char *str1 = "tianya"; char str2[] = "tianya";

   

在上面代码中: str1 是一个指针变量,str2 是指针常量,所以 str2 不能使用 ++ 或 —— 运算符。输入对应字符串的值如下: printf("str1 的值为 %s \n",str1); printf("str2 的值为 %s \n",str2);

另外,我们还需要理解一下,下面这几个的定义方式的不同:

char *str = "tianya"; char str[] = "tianya"; char str[10] = "tianya"; char str[2] = "tianya";

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

读C++ Primer 之构造函数陷阱

读C++ Primer 之智能指针

读C++ Primer 之句柄类

将C语言梳理一下,分布在以下10个章节中:

Linux-C成长之路(一):Linux下C编程概要

Linux-C成长之路(二):基本数据类型

Linux-C成长之路(三):基本IO函数操作

Linux-C成长之路(四):运算符

Linux-C成长之路(五):控制流

Linux-C成长之路(六):函数要义

Linux-C成长之路(七):数组与指针

Linux-C成长之路(八):存储类,动态内存

Linux-C成长之路(九):复合数据类型

Linux-C成长之路(十):其他高级议题

5、一维数组和指针

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/2cd3077b468c7c179873ad1d5a433856.html