指针的说明

指针的说明,第1张

指针的说明
什么是指针, 这就要从内存说起, 内存是机算机在运行的时候存储数据的地方. 而CPU访问内存的方式, 就是访问地址, 所谓的地址, 是在 *** 作系统初始化时就做好的事情, 每个内存块, 都有一个唯一的序号和它对应, 这个序号, 在机算机这里叫做内存地址.

通常情况下.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++程序的核心.

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1499257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存