标签:电脑 适合 部分 course 原型 print 存储 组元 pre
部分引用
- c语言指针怎么理解 知乎
 - 程序设计入门————c语言 (浙江大学翁恺)
 - 《c primer plus》第六版
 

int *a, b 或 int* a, b 中只有a是int指针类型,b是int整型。
关于电脑大小端的讨论:大端是指是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中。小端是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内在的低地址中。例如下图:

32位和64位下指针的长处不同,32位下为4个字节,和int一样,64位下8个字节。
#include <stdio.h> 
int main(){
    int a[10]={1,2,3,4,5,6,7,8,9,10};  //定义一个整型数组,这里a实质上是一个指向数组中第一个数据a[0]的指针
    int *p=a;  
    printf("%d\n",*p);
    printf("%d",*(p+1));    
    
    return 0;
} 
返回结果为:
1
2
#include <stdio.h>
int main(){
    int d[10];
    int *e;
    
    e=&d[0]; //e保存了数组d的第一个数据的地址
    
    for (int i=0; i<10; i++){
        *e = i; //把该地址中的数据依次赋值0,1,2,3,4,5,6,7,8,9 
        e++; //地址累加一次,也就是数组中下一个数据的地址
    } 
    
    for (int i=0; i<10; i++){  
        printf("%d\n", d[i]);  //打印数组d中的所有元素 
    } 
    return 0;
    
} 
#include <stdio.h>
//此方法为最简单,最基础的数组遍历 
int search(int key, int a[], int len)
int main()
{
    int a[]= {1,3,5,2,9,4,12,23,15,32};
    int r = search (12, a, sizeof(a)/sizeof(a[0]));   //传入参数的时候在main函数中计算好函数的个数传入到search函数中;另外,此处a传入的时a[0]元素的地址。
    printf("%d\n", r);
    return 0;
 } 
 
int search(int key, int a[], int len)   //len变量必须要加,因为在search函数中无法用sizeof函数计算数组的大小
{
    int ret = -1;
    int i;
    for (i=0; i<len; i++){
        if (key == a[i]){
            ret = i;
            break;
        }
    }
    return ret;
}
#include<stdio.h>
int main(){
    int a[2][3]={{1,2,3},{4,5,6}};
    
    printf("%p\n",a);   //输出指针a数据,也就是指针a[0]的地址 
    printf("%p\n",a+1);   //输出a+1的数据 ,也就是a[1]的地址
    printf("%p\n",&a[0]);
    printf("%p\n",&a[1]);     //验证上述
    printf("%p\n",(*a)+1);  //输出的是a[0][1]的地址
    printf("%p\n",&a[0][1]);   //验证
    printf("%d\n",*(a[0]));  //输出的是a[0]a[0]的值 
    printf("%d\n",*(*(a+1)+1));  //输出的是a[1][1]的值 
}
注意:a是一个2行3列的数值,a+1表示的a[1]值所在的地址,a[1]的值又代表a[1][0]的值所在的地址
int i=2; int *a=&i 和 char j=‘m‘; char *b=&j 区别在于:int占据四个字节,a中虽然记载的i的第一个字节的地址,但是由于a是int类型的指针,*a读取的时候自动再往后读3个字节;而b是char类型的指针,则只读取当前记录的这一个字节,自然不能用指针b来保存int i的值。
#include <stdio.h>
int main(){
    int i = 2;
    int j = 's';
    
    int *a = &i;
    char *b = &i;
    
    int *m = &j;
    char *n = &j;
    
    printf("%d\n", *a);
    printf("%d\n", *b);  //会产生warning 
    /* 解释为什么前两行输出为什么一样:
     * 在存储中,2作为int存储为 00000010 00000000 00000000 00000000 四个字节,用此种表示方法是因为我的电脑是个小端电脑(Little-endian)。详述见下条。
     * a 和 b 所记录的都是四个字节中第一个字节的地址,*a读取到的是4个完整的字节,而*b读取到的是第一个字节 00000010,由于巧合,二者所代表的都是数字1。 
     */
    printf("%c\n", *m);  //会产生warning
    printf("%c\n", *n);
    
    return 0; 
} 
#include <stdio.h>
int main()
{
    int a = 1, b = 2;
    char c = 'c', d = 'd';
    int *m, *n;
    char *j, *k;
    m = &a;
    n = &b;
    j = &c;
    k = &d;
    
    printf("int变量在内存中的存储情况");
    printf("a  %p\n", m);
    printf("b  %p\n", n); 
    //由于栈自顶向下的存储方法,内存位置上a与b两个元素是紧邻着的,a位置高,b低,相差四个字节。 
    printf("\n");
    printf("对int指针变量+1会得到什么结果,实际改变几个字节?\n");
    printf("&b+1  %p\n", n+1);
    printf("&a-&b %d\n", m-n);
    //上两个语句测试得到结果,a与b的地址m,n相差并不是4而是1。因为相差的是存储单元数而不是字节数 
    printf("\n");
    printf("char指针变量什么情况,本来就相差1个字节?\n");
    printf("c  %p\n", j);
    printf("d  %p\n", k);
    //由于char变量只占1个字节,所以这两个变量位置地址相差为1 
    printf("\n");
    printf("\n");
    
    printf("int型指针变量占据几个字节?\n");
    printf("&m  %p\n", &m);
    printf("&n  %p\n", &n);
    printf("char型指针变量占据几个字节?\n");
    printf("&j  %p\n", &j);
    printf("&k  %p\n", &k); 
    //可以得到,在64位系统上,像m,n这种指针本身的存储都是占据8个字节,不管是char类型还是int类型。 
    
    return 0;
 } 
一句话概括指针的加减:指针加1,指针的值递增它所指向类型的大小(以字节位单位)
dates + 2 == &dates[2]
*(dates + 2) == dates[2]
标签:电脑 适合 部分 course 原型 print 存储 组元 pre
原文地址:https://www.cnblogs.com/jinshuoup/p/12194753.html