您的位置:首页 > 其它

指针、数组、二级指针、指针数组与字符串

2006-05-17 13:23 381 查看
先来一组指针和数组的比较

void TestForVectorAndPointer ()
{
char a[] = "abcd"; //栈中存放数组a[4],数组存放'a''b''c''d''/0'
printf("%x %s/n", a, a); // 0x0012FF24 abcd //对数组名操作
printf("%x %s/n", &a, &a); // 0x0012FF24 abcd //取数组首地址
printf("%x %s/n", a + 1, a + 1); // 0x0012FF25 //取数组次地址
printf("%x %c/n", *(a + 1), *(a + 1)); // 62 b //取第2个元素
printf("%x %c/n", a[1], a[1]); // 62 b //取第2个元素
printf("%x %s/n", &a[1], &a[1]); // 0x0012FF25 bcd //取数组次地址

// 不支持*(a++)的操作,数组名不能赋值

char* p = "abcd"; //栈中存放指针p,指向常量区的字符串"abcd"
printf("%x %s/n", p, p); // 0x0047E56C abcd //取字符串的首字符地址
printf("%x %s/n", &p, &p); // 0x0012FF20 乱码1 //取指针地址
printf("%x %s/n", p + 1, p + 1); // 0x0047E56D bcd //取字符串的次字符地址
printf("%x %c/n", *(p + 1), *(p + 1));// 62 b //取字符串的首字符
printf("%x %c/n", p[1], p[1]); // 62 b //取字符串的次字符
printf("%x %s/n", &p[1], &p[1]); // 0x0047E56D bcd //取字符串的次字符地址
printf("%x %c/n", *(++p), *(++p)); // 63 b //右结合b、63 // 慎用!p指向地址发生变化

char* pp = a; //栈中存放指针pp,指向常量区的数组a[4]
printf("%x %s/n", pp, pp); // 0x0012FF24 abcd //取数组首地址
printf("%x %s/n", &pp, &pp); // 0x0012FF1C 乱码2//取指针地址
printf("%x %s/n", pp + 1, pp + 1); // 0x0012FF25 bcd //取数组次地址
printf("%x %c/n", *(pp + 1), *(pp + 1)); // 62 b //取数组第2个元素
printf("%x %c/n", pp[1], pp[1]); // 62 b //取数组第2个元素
printf("%x %s/n", &pp[1], &pp[1]); // 0x0012FF25 bcd //取数组次地址
printf("%x %c/n", *(++pp), *(++pp)); // 63 b //右结合b、63 // 慎用!p指向地址发生变化
}

再来一组指针和数组的比较

void TestForVector2DAndPointer(void)
{
char* test[] = {"11", "222", "3333", "44444"}; // 栈中存放数组test[4],数组存放4个指针,每个指针均指向一个字符串
printf("%x %s/n", test, test); // 0x0012FF1C 乱码1 对数组名操作
printf("%x %s/n", &test, &test); // 0x0012FF1C 乱码1 数组地址
printf("%x %s/n", &(test[0]), &(test[0])); // 0x0012FF1C 乱码1 数组首元素的地址
printf("%x %s/n", test + 1, test + 1); // 0x0012FF20 乱码2 地址加法运算 + sizeof (int)
printf("%x %s/n", &test + 1, &test + 1); // 0x0012FF2C 乱码3 地址加法运算 + sizeof (test)
printf("%x %s/n", *(test + 1), *(test + 1)); // 0x0047C038 222 取数组次元素
printf("%x %s/n", test[1], test[1]); // 0x0047C038 222 取数组次元素
printf("%x %s/n", *(&test + 1), *(&test + 1)); // 0x0012FF2C 乱码3 地址加法运算

char** pTest = test; // 栈中存放二级指针pTest,指向数组test[4]
printf("%x %s/n", pTest, pTest); // 0x0012FF1C 乱码1 对数组名操作
printf("%x %s/n", &pTest, &pTest); // 0x0012FF18 乱码4 指针地址
printf("%x %s/n", &(pTest[0]), &(pTest[0])); // 0x0012FF1C 乱码1 数组首元素的地址
printf("%x %s/n", pTest + 1, pTest + 1); // 0x0012FF20 乱码2 地址加法运算 + sizeof (int)
printf("%x %s/n", &pTest + 1, &pTest + 1); // 0x0012FF1C 乱码1 数组首元素的地址
printf("%x %s/n", *(pTest + 1), *(pTest + 1)); // 0x0047C038 222 取数组次元素
printf("%x %s/n", pTest[1], pTest[1]); // 0x0047C038 222 取数组次元素
printf("%x %s/n", *(&pTest + 1), *(&pTest + 1)); //0x0012FF2C 11 地址加法运算
}

最后转来一个比较简洁的示例

http://www.cstudyhome.com/wenzhang06/ReadNews.asp?NewsID=6043

#include "stdio.h"
#include "stdlib.h"
/*test a funtion of 2 demesion char*/
main()
{
char s[3][3]={ {'1','1','1'},{'2','2','2'},{'3','3','3'} },**u;
int i,j;
u=s;
system("cls");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf(" %c ", *(*(u+i)+j) ); printf("/n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: