您的位置:首页 > 编程语言 > C语言/C++

黑马程序员——C语言——指针

2015-12-08 18:12 537 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1. 什么是指针?

指针就是地址,对一个内存单元来说,单元的地址即为指针,其中存放的数据是单元的内容。
变量的存取方式有两种:a. 直接存取——通过变量名存取
b. 间接存取——通过地址(指针)存取

2. 指针变量——存放指针(地址)的变量
注意事项:1. 指针是一个地址,是常量

2. 指针变量存放地址,是一个变量

指针变量的定义:
类型名 *变量名; eg: int *p; //p是一个指针变量,存放int类型变量的地址

指针变量注意事项:

定义指针变量时,“*”必须有,没有就相当于定义一个普通变量
不能用指针变量存放数值或字符
指针变量也是变量,有全局和局部之分

3. 指针变量的初始化:

定义的同时初始化

eg: int a = 3;
int *p=&a; //指针变量p指向a
int *p1 = &a, *p2 = &a;
b. 先定义后初始化
eg: int *pointer;
pointer=NULL; //此种方式最好不用,会造成野指针
c. 定义一个变量但不指向
eg: int *pointer=NULL;

注意事项:a. 多个指针可以指向同一个地址
b. 指针可以改变指向
c. 指针如果没有初始化,里面存放的是垃圾值,称为野指针

4. 指针变量的引用
使用“*”获取指针变量对应的存储单元 eg: *p = 100; //指针变量p指向的变量被赋值100
value = *p; //引用指针变量给value赋值100

指针使用实例代码
/**
*用指针实现交换两个变量的值
*/

#include <stdio.h>
void exchange(int *p1,int *p2){
//交换p1,p2两个地址中的内容
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int main(int argc, const char * argv[]) {
int a=5,b=7;
exchange(&a, &b);
printf("a=%d\tb=%d",a,b);
return 0;
}


二级指针:指针变量指向指针
int c=5;
int *p=&c;  //p是一个一级指针
int **p1=&p;  //p1是一个二级指针


数组指针:指向数组元素的指针
数组指针的作用:使用数组指针间接访问数组的元素
数组元素的初始化:
int a[2]={1,2};
int *p=&a; //p指向数组的第一个元素

数组指针和数组名的区别:
p是一个指针变量,它存放的值是可以改变的,*p++是可以的,而数组名是一个常量,不能进行自增或自减

使用指针把数组逆序的示例代码:
#include <stdio.h>
void changeArr(int a[],int len){
//数组指针指向数组a
int *p=a;
//循环把前后对应位置的元素值交换
for (int i=0; i<=len/2; i++) {
int temp;
temp=*(p+i);
*(p+i)=*(p+len-i-1);
*(p+len-i-1)=temp;
}

}

int main(int argc, const char * argv[]) {
int a[5]={1,2,3,4,5};
changeArr(a, 5);
for (int i=0; i<5; i++) {
printf("%d\t",a[i]);
}

return 0;
}


一维指针数组
指针数组:数组元素的值是指针

一维指针数组的定义

类型说明符 *数组名[数组长度] eg:int *p[3];

指针数组的使用举例:

int a=3, b=4, c=5;

int *p[3]={&a, &b, &c};

通过数组元素访问a的值如下:

printf("a=%d\n",*p[0]);

通过数组名访问a的值如下:

printf("a=%d\n",**p);

二维数组指针的定义

数据类型 (*指针变量名)[二维数组的列数]

eg: int (*p1)[4];

二维数组指针的初始化

int a[2][3]={0,1,2,3,4,5};

int (*p)[3]=a;//定义一个指向数组a的行指针

二维数组指针的引用——*(*(p+i)+j) //获取二维数组的每一个元素

for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
//输出二维数组的每一个元素
printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j));
}
}


一维指针数组和二维数组指针的区别:指针数组表示的是多个指针,二维数组指针变量是一个单个变量

字符串指针——指向字符串

定义格式:char *变量名="字符串内容"; //字符串指针指向字符串

char *p1= &ch; //字符指针

根据赋值的类别来区分是字符指针还是字符串指针。

char *str="abc";把字符串常量的首地址(即第一个字符的地址)赋值给了指针变量。 //abc保存在常量区,而str只保存了字符串常量的首地址

注意:使用字符数组保存的字符串保存在栈区,保存在栈区里的内容是可读可写的;使用字符串指针保存字符串时,字符串是保存在常量区,保存的是字符串常量的首地址,常量区的内容是不可以修改的。

读取字符串量的每个字符的示例代码:

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[]) {
//定义一个字符串指针,指针保存字符串首地址
char *str="Hello susie!";
//循环遍历字符串的每一个字符
for (int i=0; i<strlen(str); i++) {
printf("%c",*(str+i));
}
return 0;
}


什么是指针?

指针就是地址,对一个内存单元来说,单元的地址即为指针,其中存放的数据是单元的内容。
变量的存取方式有两种:a. 直接存取——通过变量名存取
b. 间接存取——通过地址(指针)存取

2. 指针变量——存放指针(地址)的变量
注意事项:1. 指针是一个地址,是常量
2. 指针变量存放地址,是一个变量

指针变量的定义:
类型名 *变量名; eg: int *p; //p是一个指针变量,存放int类型变量的地址

指针变量注意事项:

定义指针变量时,“*”必须有,没有就相当于定义一个普通变量
不能用指针变量存放数值或字符
指针变量也是变量,有全局和局部之分

3. 指针变量的初始化:

定义的同时初始化

eg: int a = 3;
int *p=&a; //指针变量p指向a
int *p1 = &a, *p2 = &a;
b. 先定义后初始化
eg: int *pointer;
pointer=NULL; //此种方式最好不用,会造成野指针
c. 定义一个变量但不指向
eg: int *pointer=NULL;

注意事项:a. 多个指针可以指向同一个地址
b. 指针可以改变指向
c. 指针如果没有初始化,里面存放的是垃圾值,称为野指针

4. 指针变量的引用
使用“*”获取指针变量对应的存储单元 eg: *p = 100; //指针变量p指向的变量被赋值100
value = *p; //引用指针变量给value赋值100
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: