*(p[i]+j) *(*p+i)+j) (*(p+i))[j] *(&p[0][0]+2*i+j) *(p[0]+2*i+j)都是啥意思?*(p[i]+j)*(*p+i)+j)(*(p+i))[j]*(&p[0][0]+2*i+j)*(p[0]+2*i+j)都是啥意思?

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/12 18:32:35

*(p[i]+j) *(*p+i)+j) (*(p+i))[j] *(&p[0][0]+2*i+j) *(p[0]+2*i+j)都是啥意思?*(p[i]+j)*(*p+i)+j)(*(p+i))[j]*(&p[0][0]+2*i+j)*(p[0]+2*i+j)都是啥意思?
*(p[i]+j) *(*p+i)+j) (*(p+i))[j] *(&p[0][0]+2*i+j) *(p[0]+2*i+j)都是啥意思?
*(p[i]+j)
*(*p+i)+j)
(*(p+i))[j]
*(&p[0][0]+2*i+j)
*(p[0]+2*i+j)都是啥意思?

*(p[i]+j) *(*p+i)+j) (*(p+i))[j] *(&p[0][0]+2*i+j) *(p[0]+2*i+j)都是啥意思?*(p[i]+j)*(*p+i)+j)(*(p+i))[j]*(&p[0][0]+2*i+j)*(p[0]+2*i+j)都是啥意思?
p是一个二维数组,二维数组在内存中是连续存储的.


*(p[i]+j)
p[i]表示的是指向第i行的指针,是int*型的.所以*(p[i]+j)其实和p[i][j]是一样的.


*(*p+i)+j)
这个少了个括号,应该是*((*p+i)+j)或者是*(*(p+i)+j)
如果是*((*p+i)+j)的话,*p指向的是第一行元素,那么这个式子其实就是*(p+i+j).就是从第一个元素开始数i+j个元素.


如果是*(*(p+i)+j)的话,这个其实和p[i][j]一样.


(*(p+i))[j]
p+i可以看成是p移动i行,解引用后指向第i行元素的首地址.下标运算[j]就是取第j个元素.和p[i][j]一样.


*(&p[0][0]+2*i+j)
&p[0][0]是取p[0][0]的地址,返回的是一个int*指针.+2*i+j其实就是从第一个元素开始向后移动2*i+j个元素.


*(p[0]+2*i+j)
这个其实是和*(&p[0][0]+2*i+j)一样的,因为p[0]和&p[0][0]都是指向第一行的元素,两个都是int*指针.地址一样的.


这里我写了一个简单的代码,你可以对照看看
#include <stdio.h>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
\x05int a[10][10];
\x05int count=0;
\x05for (int i=0;i<10 ;i++ )
\x05{
\x05\x05for (int j=0;j<10 ;j++ )
\x05\x05{
\x05\x05\x05a[i][j]=count;
\x05\x05\x05count++;
\x05\x05}
\x05}
\x05for (int i=0;i<10 ;i++ )
\x05{
\x05\x05for (int j=0;j<10 ;j++ )
\x05\x05{
\x05\x05\x05cout<<a[i][j]<<"\t";
\x05\x05}
\x05\x05cout<<endl;
\x05}
\x05/*
\x05*(p[i]+j)
*(*p+i)+j)
(*(p+i))[j]
*(&p[0][0]+2*i+j)
*(p[0]+2*i+j)都是啥意思?
\x05*/
\x05int i=4,j=5;
\x05cout<<a[i][j]<<endl;
\x05cout<<*(a[i]+j)<<endl;
\x05cout<<*((*a+i)+j)<<endl;
\x05cout<<a[0][i+j]<<endl;
\x05cout<<(*(a+i))[j]<<endl;
\x05cout<<*(&a[0][0]+2*i+j)<<endl;
\x05cout<<*(a[0]+2*i+j)<<endl;
\x05return 0;
}