C语言之指针综合谈

概述

Joel Spolsky认为,对指针的理解是一种aptitude,不是通过训练就可以达到的。虽然如此,我还是想谈一谈这个C/C++语言中最强劲也是最容易出错的要素。

鉴于指针和目前计算机内存结构的关联,很多C语言比较本质的特点都孕育在其中,因此,本篇和第六、第七两篇我都将以指针为主线,结合在实际编程中遇到的问题,来详细谈谈关于指针的几个重要方面。

指针类型的本质分析

1、指针的本质

指针的本质:一种复合的数据类型。下面我将以下面几个作为例子进行展开分析:

a)、int *p;

b)、int **p;

c)、int (*parValue)[3];

d)、int (*pFun)();

分析:

所谓的数据类型就是具有某种数据特征的东东,比如数据类型char,它的数据特征就是它所占据的内存为1个字节, 指针也很类似,指针所指向的值也占据着内存中的一块地址,地址的长度与指针的类型有关,比如对于char型指针,这个指针占据的内存就是1个字节,因此指针也是一种数据类型,但我们知道指针本身也占据了一个内存空间地址,地址的长度和机器的字长有关,比如在32位机器中,这个长度就是4个字节,因此指针本身也同样是一种数据类型,因此,我们说,指针其实是一种复合的数据类型,

好了,现在我们可以分析上面的几个例子了。

假设有如下定义:

int nValue; 

那么,nValue的类型就是int,也就是把nValue这个具体变量去掉后剩余的部分,因此,上面的4个声明可以类比进行分析:

a)、int *

*代表变量(指针本身)的值是一个地址,int代表这个地址里面存放的是一个整数,这两个结合起来,int *定义了一个指向整数的指针,类推如下:

b)、int **

指向一个指向整数的指针的指针。

c)、int (*)[3]

指向一个拥有三个整数的数组的指针。

d)、int (*)()

指向一个函数的指针,这个函数参数为空,返回值为整数。

分析结束,从上面可以看出,指针包括两个方面,一个是它本身的值,是一个内存中的地址;另一个是指针所指向的物,是这个地址中所存放着具有各种各样意义的数据。

时间: 2024-10-29 17:09:04

C语言之指针综合谈的相关文章

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面也讲了许多,也提到了多级指针的概念,那具体我们怎么去操作呢 #include <stdio.h> #include <stdlib.h> main(){ int i = 3; //一级 int* p = &i; //二级,保存一级指针 int** w = &p; //三

c语言-求问一个C语言字符指针的问题

问题描述 求问一个C语言字符指针的问题 #include void Initialize (char * a, char * b) { a[0] = 'T'; a[1] = 'h'; a[2] = 'i'; a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's'; a[7] = ' '; a[8] = 'A'; a[9] = ''; b = a; b[8] = 'B'; } #define ARRAY_SIZE 10 char a[ARRAY_SIZE];

c语言二级指针申请空间问题

问题描述 c语言二级指针申请空间问题 char **data; *data = malloc (100); 为什么段错误 应该怎么申请 解决方案 *data = malloc (sizeof(char *) * 100); for (int i = 0; i < 100; i++) { data[i] = malloc(sizeif(char)); } 解决方案二: **只申请两次.共1M左右内存 char **data=malloc(sizeof(char *)*100); data[0] =

c语言-C语言利用指针来存输入的字符串的问题

问题描述 C语言利用指针来存输入的字符串的问题 这个函数是可以得到str的: #include <ctype.h> char * getword(char * str) { int i; int ch; while ((ch = getchar()) != EOF && !isspace(ch)) *str++ = ch; *str = ''; if (ch == EOF) return NULL; else { while (ch != ' ') ch = getchar()

二维数组-关于C语言的指针数组的问题

问题描述 关于C语言的指针数组的问题 老师说过 传递一个二维数组时 必须指定 第二维的 个数 才能正确索引 数组1维+1的位置 函数参数传递 都是写成这样 abc(int* array[10]) 但是看到main函数的 参数确是 int main(int argc, char* argv[], char* env[]) 这样写 能索引argv+1 的位置吗? 解决方案 当然可以,C语言是一种简陋和原始的语言,它简陋的程度对于用惯了高级编程语言的人来说匪夷所思,比如你完全可以越界访问数组,至于结果

c语言中指针p 和 p++的问题

问题描述 c语言中指针p 和 p++的问题 int main() { int * ptr=(int*)malloc(10);//arr; printf("%dn",ptr); printf("%dn",ptr++); } 为什么输出的值是一样的呢? 解决方案 ptr就是当前指针, ptr++,在引用是,取得是当前指针的值,使用之后,该值自加,这是后自加的方式. 同理(*ptr)++ 值为当前指针所指的值,运算过后,指针指向下一个 解决方案二: ptr是一个指向数组的

c语言数组指针,不报错,就停止工作,请问哪里错了

问题描述 c语言数组指针,不报错,就停止工作,请问哪里错了 第一次提问,多包含,也不报错,为什么一运行就按停止工作报错 #include #include #include struct arr { int *pbase;//第一个元素的首地址 int len;//数组所能容纳的最大元素个数 int cnt;//当前数组有效元素个数 }; void init_arr(struct arr *p1,int length) { (p1->pbase) = (int *)malloc(sizeof(i

关于C语言二重指针的疑惑求解

问题描述 关于C语言二重指针的疑惑求解 程序如下,十分简短: #include void main(){ int a[3][4]={{1,2,3,4},{10,20,30,40},{100,200,300,400}}; printf("&a==%d ",&a); printf("a==%d ",a); printf("&a[0]%d ",&a[0]); printf("a[0]==%d ",a[

malloc-C语言字符指针问题求解答

问题描述 C语言字符指针问题求解答 main(){ char * a; a=(char * )malloc(40); scanf(""%s""* a );}上面代码中的scanf(""%s""* a);这行为什么是合法的?请赐教!不好意思第一次代码输错了-_- 解决方案 创建了一个40个字符长度的缓冲区,然后输入字符到这个缓冲区中.你测试下就知道了. 解决方案二: a=(char)malloc(40); 看不懂这要干嘛,怎么不