
只有指针地址是不能知道指针大小的,如果你觉得能够取到大小,那么考虑一下C语言中的字符串指针就知道了。为什么C语言的字符串需要以\0字符来结尾呢?就是因为不知道字符串到底包含多少个字符,所以C程序就规定,从首地址一直往下读取,直到遇到\0字符,就表明字符串结束了。所以,对于你那个
数组
指针,如果想知道指向的内容有多少,那要么就使用某个特殊内容作为数组结束的标志,要么就是用一个变量来保存数组中包含的数据项的个数。
改成以下这样就可以了,因为你原来的先执行p++;后打印,由于打印前p++已经执行一次了,也就是地址向下移了一位,所以你的打印是从第二个数开始打印,而且打印最后那个数会内存越界出错。
#include<iostream>
using namespace std;
main()
{
int i,p;
int a[10]={12,23,85,8,54,77,89,44,20,95};
p=&a[0];
for(i=0;i<10;i++)
{
cout<<p;//先打印
p++;//再移到下一位
}
cout<<endl;
}
单维数组名就是首地址,多维数组名就是第1维的首地址,因此取首地址,可以把数组名赋给对应的指针变量,或取索引为0的首个元素地址赋给对应的指针变量。举例:
单维 int arr[10]; int p =arr; 或 int p =&arr[0];
二维 int arr[10][10]; int (p)[10] =arr; 或int (p)[10] = &arr[0];// 取第一维地址
int arr[10][10]; int p= & arr[0][0]; // 取多维中的首个元素
int my_max = -INT_MAX;
int rnd = 0;
//第一步取得数组里最大数
for (i = 0; i < sizeof(arr), ++i) {
if (arr[i] > my_max) my_max = arr[i];
}
//第二步生成随机数
srand(time());
rnd = (int)(my_max ((double)rand() / RAND_MAX));
for (i = 0; i < sizeof(arr); ++i) {
if (arr[i] > rnd) printf("%d\t", arr[i]);
}以上未经调试,仅示意,供参考指针解遍历数组例题:
#include <stdioh>
int main(){
int arr[] = { 99, 15, 100, 888, 252 };
int i, p = arr, len = sizeof(arr) / sizeof(int);
for(i=0; i<len; i++){
printf("%d ", (p+i) );}
printf("\n");
return 0;
}
数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用sizeof(p) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组)。所以 sizeof(p) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。也就是说,根据数组指针不能逆推出整个数组元素的个数,以及数组从哪里开始、到哪里结束等信息。对于函数:int find(int a[], int value),其中a为整型数组首地址,value是被检验值。我们可以利用指针a间接引用数组第一个元素的值,并将其与value比较,比较完后,将指针向后移动,再通过间接引用的方式比较下一个元素值,依次下去,直到在整型数组中找到被检验值或者整型数组所有元素比较结束为止。
那么这里有个问题,我们如何通过指针知到整型数组什么时候结束呢?对于整型数组而言,没有办法,所以我们必须先知道整型数组的长度,可以在参数中给出,也可以在主函数定义中知晓。
程序如下:
int find(int a[], int value)
{
int i=0,p=a;
for(i=0;i<=9;i++)
{
if(p==value)
return p;
else
p++;
}
if(i>=10)
return 0;
}
main()
{
int c[10]={1,2,3,4,5,6,7,8,9,0};
int n;
scanf("%d",&n);
printf("%x %d",find(c,n),(find(c,n)));/第一个为函数返回地址,第二个为函数返回地址里的值/
getch();
}
另外,我们测试一个程序或者函数是否正确不在于其能否正确运行,而在于其运行的结果是否符合我们的预期。针对上述程序,测试方法如下:
输入任意一个数,如果这个数在数组C内,看是否能够打印出16进制的地址数和与输入值相同的数;如果不在数组C内,看是否返回值为0的地址。
假设这个数组有N行M列,并假设单元的类型为char:
i=0,n,N-1;j=0,m,M-1。
将指针pt指向第n行第m列的单元首址:
pt=array+nN+m;
为了知道p的单元位置,采用以下代码得到:
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
pt=array+iN+j;
if(pt==p)
{
printf("i=%d,j=%d",i,j);
break;
}
原文地址:

