0.#define typedef的区别
{
typedef int* INT;
#define int* Int;
int main()
{
INT pa, pb;
Int pc, pd;
return 0;
}
typedef就相当于是定义了一个新的关键字 INT 它定义的所有变量都是指针类型
而#define只是把int*换成了Int
所以我们得到的pa,pb都是指针变量
而pc是指针变量,pd不是。
}
1.字符指针,贴代码:
int main()
{
char ch = 'w';
char* p = "abcdef";
*p = ch;
printf("%c", *p);
return 0;
}
一般认为这个会打印出来w而不是a因为p仅仅是一个字符指针字节大小不够存下abcdef\0这些字符所以默认是a,但是程序会报错因为这样定义的p只存储在内存中的只读数据区不能被修改。
由此可以得出结论,这样的定义方式与int const*p='a'是等价。
2.
关于int const*和 int *const的区别在于
前者是指针指向的对象不可被修改,而后者是指指针变量本身不可以被修改:运行结果如下
int main()
{
char ch = 'w';
const int* p = &ch;
*p = 'a';
printf("%c", *p);
return 0;
}
int main()
{
char ch = 'w';
char c = 'h';
int* const p = &ch;
printf("%c", *p);
p = &c;
return 0;
}
下面看一道笔试题:
int main()
{
char arr1[] = "abcd";
char arr2[] = "abcd";
char* arr3 = "abcd";
char* arr4 = "abcd";
if (arr1 == arr2)
printf("yes\n");
else
printf("no\n");
if (arr3 == arr4)
printf("yes\n");
else
printf("no\n");
return 0;
}
结果:
理由:
arr1与arr2虽然内容相同但是是两个不同的字符数组,存储在内存中的位置当然不相同,所以二者不相等
而arr3与arr4根据前面的结论我们知道二者都存的是常量字符'a',而二者都一样没有必要再使用一个块空间,故二者相等。
3.指针数组。
顾名思义 由整型数组、字符数字、浮点数组可知,指针数组是用来存储指针变量的数组,
下面简简单单贴一点代码分析玩玩~
int main()
{
int* arr1[] = { "abcd","efgh","hijk" };
int sz = sizeof(arr1) / sizeof(arr1[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s\n", arr1[i]);
}
return 0;
}
根据之前学过的字符串只是,指针数组里面存放的是指针变量,当然可以用来存储字符串,故打印出来是字符串形式,其相关大小为:
显然指针数组里面存放了12个字符,一个字符是一个字节,所以他的大小是12个字节;
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 6,7,8,9,10 };
int arr3[5] = { 11,12,13,14,15 };
int *arr[] = { arr1,arr2,arr3 };
int i = 0;
int j = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
是不是看到了两个方块想起来了二维数组?确实我们说指针和数组有相似的地方,但是显然二者又不尽相同 。
类似的我们可以像操纵二维数组那样来改写这个代码
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 6,7,8,9,10 };
int arr3[5] = { 11,12,13,14,15 };
int *arr[] = { arr1,arr2,arr3 };
int i = 0;
int j = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", *(*(arr+i)+j));
}
printf("\n");
}
return 0;
}
这样我们得到结果是一样的。
分析:
arr可以看作是二级指针,他加了i之后解引用就指向arr1(2,3),再对其 +j解引用就指向了上面三个数组中的元素,所以得到的结果与上面的代码一样。