指针与数组

前面的东西都比较基础,后面的这个才是真正关键的地方。

示例代码:

#include <iostream>
#include <stdlib.h> 

int main(int argc, char *argv[]) {
    //argc 指的是参数个数
    // argv[0]指的是程序的名字
    // argv[1]值的是程序执行的第一个参数

    int array[10]={1023,2,3,4,5,6};
    int *p = &array[0];
    int *p1 = array;

    printf("%p,%p\n",array,&array[0]);
    //十六位的地址
    //两个地址的值,并且两个地址相同。 

    printf("*p = %d\n",*p);
    //1
    printf("*p1 = %d\n",*p1);
    //1
    printf("sizeof(array) = %d,sizeof(p1) = %d\n",sizeof(array),sizeof(p1));
    //40,8
    printf("%d,%d\n",sizeof(int *),sizeof(char *));
    //8,8
    printf("array =%p,*array =%p,&array = %p\n",array,*array,&array);
    //地址的值,跟上面的结果一样的,15个0后面1,(如果是32位的操作系统的话,应该是7个0后面一个1),地址的值,跟最上面一样 

    //这个结果是什么呢?
    printf("%d\n",*((char *)p1+1));
    //这个地方很奇怪,总是觉得有问题。
    //但是好像就是 0啊。
    return 0;
}

运行结果:

这个地方多少有点儿出入,就是为了把那个 结果试出来。所以能看得出来,开始数组里面第一个数字给的是1.

来看看为什么最后一行的结果是3.前面的不知道为什么的同学可以看看这个地址里面书写的内容:

http://www.cnblogs.com/letben/p/5213967.html

void function2(void){
    //上面的如果看懂了的话,下面的都比较简单了
    char buf[10] = {"abcdef"};
    char *pc = buf;
    printf("%c\n",*(pc+3));
    int i = 0x12345678;

    char *cpi = (char *) &i;
    printf("%x,%x,%x,%x\n",*(cpi+0),*(cpi+1),*(cpi+2),*(cpi+3));

}

运行结果:

这个表现出操作系统相关性,如果是一般的windows,或者linux都是这种先输出小端的,如果是服务器型的unix的话,就会出现12,34,56,78的结果。

利用指针进行赋值:

代码:

/**
    利用指针进行赋值。
*/
void function3(void){
    int array[10]={0};
    int *p = array;
    for(int i = 0;i<10;i++){
        scanf("%d",p++);
    }
    for(int i= 0;i<10;i++){
        printf("%d\n",array[i]);
    }
}

运行结果:

/**
    指针数组 与数组指针
*/
void function4(void){
    char *s[10];//指针数组
    char (*s1)[10];//数组指针
    //第一个表达的意思是,有一个数组,里面有10个元素,每个元素都是一个指向 字符数组 类型 的 指针变量。
    //所以可以有
    char c1[2];
    char c2[3];
    char c3[4];
    s[1] = c1;
    s[2] = c2;
    s[3] = c3;
    //第二个是数组指针,是一个指向有10个字符大小的字符数组的指针变量。
    char cc[2][10];
    //[Error] cannot convert ‘char [2][5]‘ to ‘char (*)[10]‘ in assignment
    s1 = cc;
    s1 = &cc[1];
    //这些东西 明天好好在理解一下
    int i;
    int * p;
    p = &i;
    //同理:
    char mychars[10];
    s1 = &mychars;
}
时间: 2024-10-10 07:28:00

指针与数组的相关文章

指针和数组

指针的几个要点: 一 指针的定义,赋值 要区分: int a; int *p = &a; 这是定义的时候初始化,即赋值 ======================= int a; int *p; p = &a; 定义,初始化分开,  就这里我迷惑了好久 ========================== 多个(修饰符)修饰变量,看变量名先和谁结合(先看后缀)(ps:符号和变量之间的空格不要计算,和距离无关 int*和int *....... int * p [5]    先和[ ]结合

C---通过指针访问数组

C语言规定:如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下一个元素. 引入指针变量后,就可以用俩种方法来访问数组元素了. 如果p的初值为&a[0],则: P+i 和a+i 就是a[i]的地址,或者说它们指向a数组的第i个元素. *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i].例如,*(p+5)或*(a+5)就是a[5]. 指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价. 根据以上叙述,引用一个数组元素可以用: 1.下标法:即用a[i]形式

指针、数组的理解与关系

一.指针的本质:变量,指针变量就是指针变量int *p:两个变量,一个p(指针变量本身)是int *类型的 另一个是*p(指针指向的那个变量)是int类型的注:指针说白了就是指针类型,前面定义的int类型是为了说明指针指向的那个数的类型,所以指针的解析方式都是按地址来解析的(不管你是char *还是double *,解析方式都是地址)而指向的那个数的类型就要看你怎么定义的了例如:int *aa是按照地址来解析的:*a则是按照int类型来解析的. (1)所有的类型的数据存储在内存中,都是按照二进制

程序设计基石与实践之C语言指针和数组基础

英文出处:Dennis Kubes:  <Basics of Pointers and Arrays in C>. 关于C语言中指针和数组的争论就像是一场恶战.一方面,有些人觉得,所有人都必须承认指针与数组是不同的.而另一些人则认为数组被当成指针来处理,因此它们不应该有什么区别.这种现象让人迷惑.然而,这两种说法其实都是正确的. 数组不是指针,指针也不能说是数组.在C语言中,指针仅在内存中代表一个地址,而数组是许多连续的内存块,多个类型相似的元素存储在其中.更深入的解释,请参考我之前的博文&l

C语言--&gt;(十一)指针于数组

知识点: • 指针与变量 (指向变量的指针)• 指针与函数 (地址传递) • 指针与数组 (指向数组的指针) • 指针与字符串 =================================数组的指针 1.什么是数组指针 1)数组的指针是指数组在内存的的起始位置 2)数组的第一个元素和数组的起始地址一致 2.数组名的本质 1)数组名本质上是一个地址常量,代表的是数组的首地址也就是第一个元素的地址 数组名表示表示数组的起始地址,不表示整个数组,不能对数组整体赋值. 3.数组名为一个指针常量,可

指针的数组

前言:上一篇,提到了栈和堆,想必你也清楚了栈和堆的区别,现在 通过指针的数组来看一下,指针是如何操作栈和堆的. 栈里面的数组: <span style="font-size:18px;"> int a[10]; //这个空间实在栈内存中申请的 int *p =NULL: p =a; //a是数组的首地住所以可以直接赋值给指针p p[0]=10; //就等同于a[0]=10;</span> 这个是堆里面的数组: <span style="font-

转: 浅谈C/C++中的指针和数组(二)

转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&取数组的地址 规则2:下标总是与指针的偏移量

转:浅谈C/C++中的指针和数组(一)

转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 浅谈C/C++中的指针和数组(一) 指针是C/C++的精华,而指针和数组又是一对欢喜冤家,很多时候我们并不能很好的区分指针和数组,对于刚毕业的计算机系的本科生很少有人能够熟练掌握指针以及数组的用法和区别.造成这种原因可能跟现在大学教学以及现在市面上流行的很多C或者C++教程有关,这些教程虽然通俗易懂,但是在很多关键性的地方却避而不谈或者根本阐述不清楚,甚至很

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

指针和数组及内存管理

1. 指针和地址 TCPL 中给指针的定义是: A pointer is a group of cells (often two or four) that can hold an address . int value = 10; int *pvalue = &value; 上面这个语句的内存模型是: 注意: &(取地址)操作符只对内存中存在的对象起作用,如变量和数组类型.不能对表达式,常量和寄存器变量使用取地址操作. *(析取)操作符应用于一个指针变量时,取得这个指针变量所指向的对象.