数组 指针

//以下代码输出12、//3行4列

#include <iostream>
int main()
{
    double alpha[][4] = { {0}, {1,2}, {3,4,5} };

   //double alpha[][4] = { {0}, {1,2}, {3,4,5} };//编译有错:incomplete element type
    std::cout << sizeof(alpha) / sizeof(double);
    return 0;
}

 

选择正确的语句:
void Test()
{
1:--------------------------------
sprintf(pBuf, "%s", "This is a test.\n");
printf("%s", pBuf);
2:--------------------------------
}
a. 1:char *pBuf = new char [20]; 2:delete[] pBuf;
b. 1:char *pBuf = new char (20); 2:delete pBuf;
c. 1:char *pBuf = (char *)malloc(20); 2:delete[] pBuf;
d. 1:char *pBuf = (char *)malloc(20); 2:delete pBuf;

参考答案A

 

 

 

char *lpc = new char('a'); //开辟一个内存单元,并用括号里的初始化
char *Lpcc = new char[15]; //开辟一个数组

示例:

new char(10)    这个用10来初始化你定义的指针所指向的那个char

new char[10]     定义了一个有10个char元素的数组

释放内存的方法也不一样:
delete lpc;
delete [] lpcc;

参考资料

https://blog.csdn.net/qq_22642239/article/details/85230914+

 

 

有一个char*类型的指针,恰好指向了一个int,想让这个指针跳过int指向下一个char,下面的代码可以达到这个目的是:

A: ((int *)p)++;

B : p += sizeof(int);

答案为:B,A已经强制转化为int类型指针,但是最好还是需要char*,所以错了。

实际测试结果为

int main()
{

    char * p = "wahaha";
    printf("%p\n", p); // 006E8BDC
    // ((int *)p)++; // compile error
    // Assignment to cast is illegal, lvalue casts are not supported.
    int *q = (int *)p;
    q++;
    printf("%p\n", q); // 006E8BE0

    p += sizeof(int);
    printf("%p\n", p); // 006E8BE0
}


 

int main()
{
    int a[5]={1,3,5,7,9};

    char * p;
    p = (char*)a;
    p += sizeof(int);
    printf("%p %p\n", a, p); // 012FF850 012FF854

    int * q;
    q = (int*)a;
    q++;
    printf("%p %p\n", a, q); // 012FF850 012FF854

    char * r;
    r = (char*)a;
    //((int *)r)++; // compile error
    // Assignment to cast is illegal, lvalue casts are not supported.
    printf("%p %p\n", a, r); // 012FF850 012FF850


    return 0;
}

 

*p++


int main()
{

    int a[5]={1,3,5,7,9};
    int *p;
    int x;

    a[0]=1;a[1]=3;
    p = a;
    x = *p++;
    cout << x << endl; //  1
    cout << *p << endl; // 3
    for (int i = 0; i < 5; i++) cout << a[i] << " "; // 1 3 5 7 9
    cout << endl;

    a[0]=1;a[1]=3;
    p = a;
    x = (*p)++;
    cout << x << endl; // 1
    cout << *p << endl; // 2
    for (int i = 0; i < 5; i++) cout << a[i] << " "; // 2 3 5 7 9
    cout << endl;

    a[0]=1;a[1]=3;
    p = a;
    x = *(p++);
    cout << x << endl; // 1
    cout << *p << endl; // 3
    for (int i = 0; i < 5; i++) cout << a[i] << " "; // 1 3 5 7 9
    cout << endl;

    int x = 3, y;
    int *px = &x;
    y = *px++;
    cout << x << " " << y << endl; // 3 3
    cout << px << " " << &x << endl; // 00BBF7AC 00BBF7A8

    return 0;

}

 

因为++运算符优先级高于*,所以*p++等于*(p++),

*p++:等同于*p;  p++。p指向的值不变,p地址本身++

(*p)++等于*p,  (*p)++。p指向的值++,p地址本身不变。


解析:由于*和++的运算优先级一样,且是右结合。故*p++相当于*(p++),p先与++结合,然后p++整体再与*结合。前面陈述是一种最常见的错误,很多初学者也是这么理解的。但是,因为++后置的时候,本身含义就是先运算后增加1(运算指的是p++作为一个整体与前面的*进行运算;增加1指的是p+1),所以实际上*p++符号整体对外表现的值是*p的值,运算完成后p再加1.

【注意】是运算后p再加1,而不是p所指向的变量*p再加1

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值