通常情况下.CPU在访问某个C程序里面的变量时, 首先需要知道这个变量的地址, 然后通过取值指令把这个地址的数据放到CPU内部, 这时候才能对这个值进行下一步 *** 作, *** 作完成后如果这个变量的值发生了变化, 就又把这个值放回到变量地址处, 如果变量没有发生变化, 这个地址就有可能被扔掉, 在CPU内腾出地方存别的变量的地址.
而指针, 随着计算机CPU位数的不同(32位CPU, 64位CPU), 它的大小也不同, 一般情况下, 会用long来存储指针值, 而在C或是C++里面,则使用不同的方式, 但是他们的本质上是相同的.
比如:
int *c = new int;
*c = 10;
delete c;
这段代码中, 定义了一个int*这样的指针, 使用sizeof *** 作符输出它的大小.
printf( "%d %d %d\n", sizeof( c ), sizeof( int* ) , sizeof( long ) );
这时候会发现输出的值是相同的. 这也证明了指针大小是和CPU相关的.
指针就是地址, 只要知道某个变量的地址, 那么就可以对它做任何 *** 作, 或是使用其它类型篡改它的值, 比如下面代码:
float *f = new float;
*f = 10.0f;
int *lpi = (int*)f;
*lpi = 20;
printf("%f\n", *f);
delete f;
会发现输出的是个奇怪的值.
如何表示在C中使用指针表示数组, 首先需要明确什么是数组, 一般数组的定义如下:
int intArray[10];
这段代码中定义了一个长为10的整型数组, 还是回到内存上来说, 这其实是从某个内存地址处给出了连续10个int的内存块, 而intArray这个名字单独使用时, 就是一个指针,等同于int*这样的变量. 我们在访问数组中某个变量时, 使用下面代码:
int c = intArray[5];
printf("%d\n", c);
此时输出的还是随机数值, 为了初始化这10个整型数据, 使用下面代码:
for ( int i = 0; i < 10; i ++ )
{
intArray[i] = i;
}
int c = intArray[5];
printf("%d\n", c );
上面也说了, intArray等同于指针, 那么, 就会有下面的代码:
int *pointer = intArray;
printf("%d\n", pointer[6] );
当然也可以直接定位到第六个数组处, 此时, 使用下面代码都可完成此 *** 作
int *pointer2 = pointer + 6;
int *pointer3 = &intArray[6];
printf("%d, %d\n", *pointer2, *pointer3);
同样, 下面代码也会是可以正常工作的代码
int *arrayPointer = new int[20];
for ( int i = 0; i < 20; i ++ )
{
arrayPointer[i] = i;
}
for ( int i = 0; i < 20; i ++ )
{
printf("%d ", arrayPointer[i] );
}
printf("\n");
delete []arrayPointer;
C和C++中, 万物皆可看成指针, 任何变量, 哪怕是函数,都可以计算它的指针, 只要记住这点, 就会抓住C和C++程序的核心.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)