数组与指针分析

数组的本质

  • 数组是一段连续的内存空间
  • 数组的空间大小为sizeof(array_type)*array_size
  • 数组名可以看做指向第一个元素的常量指针

指针的运算

指针是一种特殊的变量,与整数的运算规则为
p+n; <--> (unsigned int)p + n * sizeof(*p);
结论
当指针p指向一个同类型的数组的元素时,p+1将指向当前元素的下一个元素;p-1将指向当前元素的上一个元素。

指针之间只支持减法运算,参与减法运算的指针类型必须相同,
注意

  • 只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差
  • 当两个指针指向的元素不在同一个数组中时,结果未定义

例子1:指针运算的应用

#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); // Key point
    char* p = NULL;  

    printf("pBegin = %p\n", pBegin);
    printf("pEnd = %p\n", pEnd);  

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

    for(p=pBegin; p<pEnd; p++)
    {
        printf("%c", *p);
    }  

    printf("\n");  

    return 0;
}  

指针的比较

  • 指针也可以进行关系比较(<,>,<=,>=)
  • 指针关系运算的前提是同时指向同一个数组中的元素
  • 任意两个指针之间的比较运算(==,=!)无限制
  • 参与比较运算的指针类型必须相同

小结

  • 数组声明时编译器自动分配一片连续的内存空间
  • 指针声明时只分配了用于容纳地址值的4字节空间
  • 指针和整数可以进行运算,结果为指针
  • 指针之间支持减法运算,其结果为数组元素下标差
  • 指针之间支持比较运算,其类型必须相同

原文地址:https://www.cnblogs.com/yanyun888/p/9213166.html

时间: 2024-11-10 01:25:21

数组与指针分析的相关文章

C语言中字符数组和字符串指针分析

这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这做个小总结,也算加深下自己的印象,写了下面的测试程序: #include <stdio.h> int main(int argc, char *argv[]){ char day[15] = "abcdefghijklmn";  char* strTmp = "opq

C语言关于数组与指针内容小结

数组的基本概念 什么是数组:数组就是:数组是相同类型的元素的一个集合       类型说明符 数组名 [常量表达式]: 其中,类型说明符是任一种基本数据类型或构造数据类型.数组名是用户定义的数组标识符.方括号中的常量表达式表示数据元素的个数,也称为数组的长度.例如: int a[10]; /* 说明整型数组a,有10个元素 */ float b[10], c[20]; /* 说明实型数组b,有10个元素,实型数组c,有20个元素 */ char ch[20]; /* 说明字符数组ch,有20个元

把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另一个vector,也是将一个vector 的元素逐个赋值给另一vector 的对应元素: //将一个vector 赋值给另一vector,使用迭代器访问vector 中的元素 vector<int> ivec(10, 20); vector<int> ivec1; for (vecto

UVALive 3942 - Remember the Word(DP,数组Trie+指针Trie)

UVALive 3942 - Remember the Word(DP,数组Trie+指针Trie) ACM 题目地址: UVALive 3942 - Remember the Word 题意: 给一些单词,然后给一个长的单词,问有几种方法能组成这个大单词,单词可以重复用. 分析: DP[i]=sum{DP[j} (i<j<len),从后往前求. 本来用数组Trie写得爽爽的,1A了. 发现2s多,不能忍! 然后用指针Trie写了一遍,各种出错,整个人都不好了... 研究了一遍别人代码,发现快

数组和指针关系的探讨

在学习过程中,数组和指针的操作几乎完全一样,且不说传数组可以用传指针完全替代,而且指针也可以使用[]操作符来访问指针偏移后的地址,所以在实际应用中数组和指针用不出任何差别.(如下代码所示) #include<iostream> using namespace std; int main() { int a[]={1,2}; cout<<*a<<endl; int* b=a; cout<<*b<<endl; return 0; } 所以人们在实际使

再谈数组与指针

首先看如下一下基础: 一.int *p:p是指向一个整数变量的指针 char *p:p是指向一个字符变量的指针 由int data[30]; int *p;有p=data;或p=&datd[1](i=0,1,2,3....) 上面成立的原因:(1)数组名是该数组首元素的地址 (2)&data表示取整个数组的地址,包括多维数组.&data[0]取数组首个元素的地址.单独data则亦表示数  组首元素的地址. (3)p是p是指向一个整数变量的指针 二. int a[3][4]:a是指向

数组和指针再次来袭

1,数组和指针的定义于声明: 定义:只能出现一次,用来确定对象的类型和大小,并为其分配空间. 声明:可以出现多次,描述对象的类型,用于指定其他地方定义的对象,不为对象分配空间. 所以说extern char a[]与extern char a[10]等价,因为这是声明,不分配空间. 看一个关于数组指针的例子: 例1: #include<stdio.h> int main() { char a[5] = { 'A', 'B', 'C', 'D' }; char(*p3)[4] = &a;

C语言 二维数组与指针笔记

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func

震惊的事实--数组与指针不相同?

△两个问题 问题1: 分析: #include <stdio.h> void main() { char a[]="happylife"; char * p = a; printf(" a ----- %x \n",&a); printf(" p ----- %x \n",&p); } 输出的结果会相同吗? 运行结果: 都是指向了数组首地址,结果为什么不一样呢? 这个问题足以说明数组和指针并不相同. 问题2: 假如文件