#运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针

#运算符:用于在预编译期将宏参数转换为字符串

#define CONVERS(x)  #x   //注:没用双引号包括。

不同类型的指针占用的内存空间大小相同。

局部变量 定义:

a[5];

打印a[i]时,a[i]为随机数。

若定义a[5]={1,2};

打印时,a[0]=1;a[1]=2;a[2]=a[3]=a[4]=0;

数组地址与数组名:

1.数组名代表数组首元素的地址。  a=&a[0];

2.数组的地址需要用取地址符号&才能得到 (&a)

3.数组首元素的地址值与数组的地址值相同。

4.数组首元素的地址与数组的地址是两个不同的概念。

a+1:(unsigned int)a+sizeof(*a)//加上一个元素大小。

&a+1:(unsigned int)(&a)+sizeof(*&a)//加上整个数组大小。

指针和数组

编译器对数组和指针处理不同。

处理指针:一次寻址操作。

char *p=“HW”

访问p时->先找到内存空间->再从内存空间取得地址->根据地址找到HW。(做了一次寻址操作)

处理数组:无寻址,直接去访问。

char p[] = "HW"

指针的运算:与整数的运算规则为

P+n:(unsigned int)p+n*sizeof(*p);

指针之间的减法:注此指针必须类型相同

P1-P2:((unsigned int)p1-(unsigned int)p2)/sizeof(type);

结论:

1.当指针P指向一个同类的数组的元素时:

P+1:将指向下一个元素。

P-1:将指向上一个元素。

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

堆区:申请的内存空间 heap。

栈区:局部变量  stack

静态区:静态变量,全局变量空间。

只读区:分配常量和程序代码空间

在main.cpp

int a=0; //全局初始化区
char *p1;//全局未初始化区
main()
{
      int b;//栈区
      char s[] = "abc";//栈区
      char *p2; //栈区
      char *p3 = "123456";123456在常量区,P3在栈区
      static int c = 0;全局(静态)初始化区
     P1=(char*)malloc(10); //堆     

}

求一个数组中元素的个数:

DIM(a) = sizeof(a)/sizeof(*a);

下标VS指针:

1.从理论上而言,当指针以固定增量在数组中移动时,其效率高于下标产生的代码(下标时,乘法很耗时)。

2.当指针增量为1且硬件具有硬件增量模型时,表现更佳。

时间: 2024-10-05 16:32:24

#运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针的相关文章

《C程序设计语言(第2版·新版)》第5章 指针与数组

指针:保存变量地址的变量:在 C中应用广泛,因为1)指针往往是表达某个计算的唯一途径:2)使用指针往往可以写出更高效紧凑的代码:另一方面,1)指针和goto一样,会导致程序难以理解:2)粗心会很容易导致指针指向了错误的地方: 指针与数组关系密切: ANSI C明确制定了操纵指针的规则,并且使用void*代替char*作为通用指针的类型: 5.1 指针与地址 内存的组织:一系列连续编号或编址的存储单元,单元可以单个操纵也可以以连续成组的方式操纵:通常1个字节可以存放一个char,2个相邻字节可以存

C# 指针学习笔记之指针类型

大学的时候学过C++.C,最近工作也不是很忙,就想起看看C#中的指针,看看.回忆一下啊,指针的用法,以下学习笔记摘自msdn:指针类型 在不安全的上下文中,类型可以是指针类型以及值类型或引用类型.指针类型声明具有下列形式之一: type* identifier; void* identifier; //allowed but not recommended 下列类型都可以是指针类型: sbyte.byte.short.ushort.int.uint.long.ulong.char.float.d

void及void指针类型

1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与技巧. 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错,提示“illegal use of ty

void类型和void *指针类型(网上摘抄总结)【转】

http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286004.html 现在在学linux编程过程中遇到很多void *指针类型,由于c很早学的有些细节不甚了解,就查了查,在C++中很少用void *指针类型的?没注意过 1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与技巧. 2.void的含义

Delphi中的指针类型

首先讲讲指针类型在delphi中是怎么定义的: 指针类型的定义语法 type <指针类型标识符>=^<基类型>: 指针指向动态变量的类型是由^符后的基类型来标识,^符号也就是指针类型,而C++中是用*符号来表示指针类型. 举例说明 type student = record    //定义个记录类型,与c++中的结构类型类似 name:string[8]; number:integer; sex:(b,g); age:integer; end; per = ^student;  /

指针与数组的区别和联系

转载: 一.指针与数组的联系: 指针与数组是C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之间的联系及在编程中的应用. 1.指针与数组的关系 当一个指针变量被初始化成数组名时,就说该指针变量指向了数组.如: char str[20], *ptr; ptr=str; ptr被置为数组str的第一个元素的地址,因为数组名就是该数组的首地址,也是数组第一个元素的地址.此时可以认为指针ptr就是数组str(反之不成立),这样

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法

由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与UnsafeMutablePointer类型,分别对应为const Type*类型与Type *类型. 而在Swift编程语言中,由于一般数组(Array)对象都无法直接用于C语言中含有指针类型的函数参数(比如:void*),所以往往需要将数组转为指针类型,此外也需要将数组中元素内容存放到连续的存储空间.此外,

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比