码迷,mamicode.com
首页 > 编程语言 > 详细

C语言-再探指针

时间:2020-10-24 10:16:49      阅读:21      评论:0      收藏:0      [点我收藏+]

标签:改变   函数指针   har   ++   值传递   不能   初始化   内存   字节   

C语言-再探指针

0.常量、变量、不可变的变量、指针

常量:可读,不可修改,存放在内存的特定区域。

变量:可读,可以修改,存放在内存的一般区域。

不可变的变量:可读,被限制不可修改,存放在内存的一般区域(依旧是变量,不可代替常量)。

const是用来限定一个"变量不允许被改变"的修饰符。

指针:类似于汇编中的“间接寻址”。

1.指向常量的指针与指针常量

//#include <stdio.h>
int main()
{
int x = 10086;
// 定义一个常量
// const修饰的是变量y引用的值(y)
const int y = 100;
// 定义一个常量
// const修饰的是变量z的值(z)
int const z = 200;
// 定义一个指向常量的指针
// const修饰的是指针指向的常量(p)
const int
p = &x;
// 定义一个指针常量,一旦初始化之后其内容不可改变
// const修饰的是指针变量q的值(q)
int* const q = &x;
printf("%d\t%d\t%d\n",x,p,q);
x = 60;
printf("%d\t",x);
// p = 70; // 会报错,对于指针变量p来说它指向的数据是不能修改的
// printf("%d\t",
p);
q = 80;
printf("%d\n",
q);
p = &y;
printf("%d\n",p);
// q = &y; // 会报错,变量q引用的数据被定义为常量,不能修改
// printf("%d\n",
q);
return 0;
}

2.指针与数组的关系

//#include <stdio.h>
int main (void)
{
// 定义整数类型的数组,每个数据占4个字节
int arr[]={0,1,2,3,4};
// int类型的步长是4字节
int
p = arr;
// char类型的步长是1字节
char
q = arr;
// 要使用void类型的指针,必须强制类型转换
void
f = arr;
printf("%d\t%d\t%d\t%d\t%d\n",arr[0],arr[1],arr[2],arr[3],arr[4]);
printf("%d\t%d\t%d\t%d\t%d\n",(p+0),(p+1),(p+2),(p+3),(p+4));
printf("%d\t%d\t%d\t%d\t%d\n",
(q+0),(q+4),(q+8),(q+12),(q+16));
printf("%d\t%d\t%d\t%d\t%d\n",((char)f+0),((char)f+4),((char)f+8),((char)f+12),((char)f+16));
return 0;
}

2.1.一维数组名作为函数参数

//#include <stdio.h>
// 当数组名作为函数参数时,C语言将数组名解释为指针
void show_array(int arr, int len)
{
int* p = arr;
for(int i=0; i<len; i++)
{
printf("%d\t",*p++);
}
printf("\n");
}
int main(void)
{
int arr[]={0,1,2,3,4};
show_array(arr, sizeof(arr)/sizeof(arr[0]));
return 0;
}

2.2值传递和地址传递

//#include <stdio.h>
void swap01 (int x, int y)
{
int tmp;
tmp=x;
x = y;
y = tmp;
printf("x=%d, y=%d\n",x,y);
}
void swap02 (int* x, int* y)
{
int tmp = *x;
*x = y;
y = tmp;
printf("
x=%d, y=%d\n",x,
y);
}
int main (void)
{
int a=10, b=20;
swap01(a, b);
printf("a=%d, b=%d\n",a,b);
swap02(&a, &b);
printf("a=%d, b=%d\n",a,b);
return 0;
}

3.指针数组
指针数组本质还是数组,而数组的元素是指针
//#include <stdio.h>
int main(void)
{
int arr[3][3]={{0,1,2},{3,4,5},{6,7,8}};
int* p[]={arr[0], arr[1], arr[2]};
printf("%d\t%d\t%d\n",(p[0]),(p[1]),*(p[2]));
return 0;
}

4.指针的指针
//#include <stdio.h>
int main(void)
{
int x = 10086;
int* p = &x;
int** q = &p;
printf("x=%d\np=%d\n**q=%d\n",x,p,**q);
return 0;
}

5.指向二维数组的指针
//#include <stdio.h>
int main()
{
//二维数组,buf为数组首地址
int buf[3][5]={{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14}};
//数组指针本质为指针,是指向数组地址的指针(行指针)。
int (a)[5] = buf;
//0行,0列元素的值
printf("%d\t%d\t%d\n",
(a[0]),((a+0)),(a));
//1行,2列元素地址
printf("%d\t%d\t%d\n",(a[1]+2),(*(a+1)+2),a[1][2]);
return 0;
}

6.指针函数和函数指针
//指针函数的本质是一个函数,其返回值是一个指针。
//#include <stdio.h>
int* pfun(int* arr, int len)
{
int* p = arr;
return p;
}
int main(void)
{
int arr[]={0,1,2,3,4}, len=sizeof(arr)/sizeof(arr[0]), i;
int* p;
p = pfun(arr, len);
for(i=0; i<len; i++) {
printf("arr[%d]=%d\n",i,(p+i));
}
return 0;
}
//函数指针其本质是一个指针变量,该指针变量指向一个函数。
//#include <stdio.h>
int add(int a, int b)
{
return a+b;
}
int main(void)
{
int (
fptr)(int, int);
int res;
fptr = add;
res = (*fptr)(1, 2);
printf("1+2=%d\n",res);
return 0;
}

C语言-再探指针

标签:改变   函数指针   har   ++   值传递   不能   初始化   内存   字节   

原文地址:https://www.cnblogs.com/JerryChen1987/p/13865857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!