第28课 指针和数组分析(上)

1. 数组的本质

(1)数组是一段连续的内存空间

(2)数组的空间大小:sizeof(array_type)*array_size;

(3)数组名可看做指向数组第一个元素的常量指针

【编程实验】a + 1的结果是什么?  (答案是第2个元素的地址)

#include <stdio.h>

int main(){

    //将数组每个元素初始化为0
    int a[5] = {0};
    int* p = NULL;

    printf("a = 0x%X\n",(unsigned int)(a));//首元素的地址
    printf("a + 1 = 0x%X\n",(unsigned int)(a + 1));//第2个元素地址

    //p + 1 ==(unsigned int)p + n*sizeof(*p);
    printf("p = 0x%X\n",(unsigned int)(p));//0x0
    printf("p + 1 = 0x%X\n",(unsigned int)(p + 1));//0x4

    return 0;
}

2. 指针的运算

(1)指针是一种特殊的变量,与整数的运算规则为:

  p + n  == (unsigned int)p + n * sizeof(*p);

  //当指针p指向一个同类型的数组的元素时,p+1指向当前元素的下一个元素,p-1指向上一个元素。

(2)指针之间只支持减法运算且参与减法运算的指针类型必须相同

  p1 - p2 = ((unsigned int)p1 – (unsigned int)p2)/sizeof(type)

  ▲注意:

  ①只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差。

  ②当两个指针指向的元素不在同一个数组中时,结果未定义。

3. 指针的比较

(1)指针也可以进行关系运算(<、<=、>、>=)

(2)指针关系运算的前提是同时指向同一个数组中的元素

(3)任意两个指针之间的比较运算(==、!=)无限制。

(4)参与比较运算的指针类型必须相同

【实例分析】指针运算初探

#include <stdio.h>

int main(){

    char s1[]={‘H‘,‘e‘,‘l‘,‘l‘,‘o‘};//栈
    int i=0;
    char s2[]={‘W‘,‘o‘,‘r‘,‘l‘,‘d‘};
    char* p0 = s1;
    char* p1= &s1[3];//p1指向s1数组的第3个元素,即‘l‘
    char* p2 = s2;
    int*  p = &i;

    printf("%d\n",p0 - p1);    //-3
    //printf("%d\n",p0 + p2);  //编译错误,指针不支持相加操作
    printf("%d\n",p0 - p2);    //指向两个不同数组,结果未定义,gcc下为12
    //printf("%d\n",p0 - p);   //编译错误,不同类型指针不能相减!
    //printf("%d\n",p0 / p2);  //编译错误,不同类型指针进行除法运算!

    return 0;
}

【实例分析】指针运算的应用

#include <stdio.h>

//统计元素的个数
#define DIM(a)  (sizeof(a) / sizeof(*a))

int main(){

    char s[]={‘H‘,‘e‘,‘l‘,‘l‘,‘o‘};//栈
    char* pBegin = s;
    char* pEnd = s + DIM(s);   //关键点,数组名 + n
    char* p = NULL;

    printf("pBegin  = %p\n",pBegin); //第1个元素的地址
    printf("pEnd  = %p\n",pEnd);     //最后1个元素的地址

    printf("Size: %d\n",pEnd - pBegin); //5

    //在同一行中打印出:Hello
    for (p = pBegin;p < pEnd; p++)
    {
         printf("%c",*p);
    }

    printf("\n");

    return 0;
}

4. 小结

(1)数组声明时编译器自动分配一片连续的内存空间

(2)指针声明时只分配了用于容纳地址值的4字节空间

(3)指针和整数可以进行运算,其结果为指针

(4)指针之间只支持减法运算,其结果为数组元素下标差

(5)指针之间支持比较运算,其类型必须相同

时间: 2024-10-17 07:58:25

第28课 指针和数组分析(上)的相关文章

第29课 指针和数组分析(下)

1. 数组的访问方式 (1)以下标的形式访问数组中的元素:如a[i]; (2)以指针的形式访问数组中的元素:如*(a+i) 2. 下标形式 VS 指针形式 (1)指针形式以固定增量在数组中移动时,效率高于下标形式 (2)指针增量为1且硬件具有硬件增量模型时,效率更高 (3)下标形式与指针形式的转换:a[n]==*(a+n)==*(n+a)==n[a]; ▲注意: ①现代编译器的生成代码优化率已大大提高,在固定增量时,下标形式的效率与指针形式相当: ②但从可读性和代码维护的角度看,下标形式更优 [

C++ 之 第六课 指针和数组

c++语言中大部分程序都离不开指针和数组,所以,我们有必要弄清楚指针和数组. 首先定一个字符数组char s[10];然后定义一个指向字符的指针char* p;数组用[]来申明,而*则表示指针.数组是以0作为下标开始,s有10个元素,从s[0]...s[9].指针可以保存它的地址如: p = &s[1];// 这句话表示了p指向了s的第2个元素.&是取地址运算符. 那么指针到底是什么东西?为什么它会有如此大的魔力?如果你了解了汇编的基础知识.其实也不难理解?简单的解释就是它保存了一个对象的

第37课 指针阅读技巧分析

1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复2.3步骤,直到阅读结束 [编程实验]复杂指针的阅读 注意:当读出是数组时,须读出元素个数.元素类型         当读出是函数是,须读出参数及类型,返回值类型         当读出是指针是,须读出指针所指向的类型,有时也须读出指针的类型. 例题① int (*p)(int*, int (*f)(int*)); A.读未标示符

指针和数组(上)

1)指针基础: 既然程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间, int main() { int i=5; int *p=&i; printf("%d,%08x\n",i,p); *p=10; printf("%d,%08x\n",i,p); return 0; } 指针本质: 指针在本质上也是一变量, 指针需要要占用一定的内存空间, 指针用于保存内存地址的值, *号的意义: 在指针声明时,*号表示所声明的变量为指针

C语言指针与数组的定义与声明易错分析

部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告诉编译器a这个名字已经在别的文件中被定义了,下面的代码使用的a是在别的文件中定义的.编译器是按文件分别编译的,当a被声明为char* a时,编译器理所当然的认为a是一个指针变量,在32位系统下占用4个byte,这4个byte存放的是地址,地址指向的空间存储的是char类型数据. 程序会返回SIGSEGV. 2

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

C和指针 (pointers on C)——第八章:数组(上)

第八章数组 本章原书作者的意图主要是跟指针进行比较,两者的共同点以及区别.因为小弟我的汇编基础为0,因此8.1.4指针的效率这一块我实在是不明白. 本科时候学的数组绝对不会像现在一样学数组,所以好好学数组! 它和指针在作为函数参数传递时是不是可以混用? 声明数组和声明指针在编译过程中是否相同? 形参可以省略几个下标,为什么? char  *a = "hello";和char a[]="hello";有什么区别? 指向整型指针的指针和指向整形数组的指针有什么区别? 总

附录一 再论指针和数组

附录一 附录一 再论指针和数组 再论指针和数组 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 预习检查 链表单元有哪几个部分组成 如何申请链表单元,及释放链表单元 实现单链表插入的基本语法 简述一下快速排序基本理论要点 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Dat

指针和数组解析

指针和数组 指针和数组是一样的吗? 经常可以看到“数组就是指针”.“数组名就是常量指针”这些说法,但真的是这样吗?让我们先看一下指针和数组的定义. 1. 指针 根据C99标准,指针的定义如下: A pointer type may be derived from a function type or an object type, called the referenced type. A pointer type describes an object whose value provides